Отдельное приложение Zend для панели управления?
Должен ли я создать отдельное Zend-приложение для пользовательского бэкэнда веб-приложения?
Моя главная проблема заключается в том, что у меня должен быть отдельный Zend_Auth как на общедоступном веб-сайте (для клиентов для входа в систему), так и для сотрудников, которые будут управлять сайтом.
Поскольку мне кажется, что я не могу использовать несколько экземпляров Zend_Auth в одном приложении, это будет единственное решение.
Следующая проблема будет состоять в том, что две сессии Zend_Auth столкнутся, поскольку они работают в одном и том же веб-пространстве?
ура
2 ответа
На самом деле, решение Бенджамина Кремера не будет работать, потому что Zend_Auth_Admin
расширяет реализацию Singleton, поэтому его getInstance()
даст Zend_Auth
экземпляр, а не Zend_Auth_Admin
один.
Я сам столкнулся с этой ситуацией и увидел, что люди ZF (по крайней мере, в ZF1) видят аутентификацию как единую точку входа в приложение (они могли бы сделать так, чтобы Zend_Auth мог содержать несколько экземпляров, используя LSB в php и т. д.), внесли незначительные изменения в код Бенджамина Кремера - вы также должны переопределить getInstance():
<?php
class AdminAuth extends Zend_Auth
{
/**
* @var AdminAuth
*/
static protected $_adminInstance;
/**
* @return Zend_Auth_Storage_Interface
*/
public function getStorage()
{
if (null === $this->_storage) {
$this->setStorage(new Zend_Auth_Storage_Session('Zend_Auth_Admin'));
}
return $this->_storage;
}
/**
* Singleton pattern implementation.
*
* @return AdminAuth
*/
public static function getInstance()
{
if (null === self::$_adminInstance) {
self::$_adminInstance = new self();
}
return self::$_adminInstance;
}
}
Zend_Auth реализует шаблон Singleton, поэтому существует только один экземпляр этого класса.
Чтобы определить, является ли текущий идентификатор администратором или пользователем, вы можете использовать isAdmin-Flag или даже лучше реализовать Zend_Acl_Role_Interface.
Если вашему приложению действительно необходимо иметь две Auth-сессии одновременно (одна для пользователя, для администратора), вы можете "скопировать" класс Zend_Auth, расширив его и настроив хранилище сеансов.
<?php
class Zend_Auth_Admin extends Zend_Auth
{
/**
* Returns the persistent storage handler
*
* Session storage is used by default unless a different storage adapter has been set.
*
* @return Zend_Auth_Storage_Interface
*/
public function getStorage()
{
if (null === $this->_storage) {
$namespace = 'Zend_Auth_Admin'; // default is 'Zend_Auth'
/**
* @see Zend_Auth_Storage_Session
*/
require_once 'Zend/Auth/Storage/Session.php';
$this->setStorage(new Zend_Auth_Storage_Session($namespace));
}
return $this->_storage;
}
}
Таким образом, вы можете использовать два разных объекта Auth для обработки вашей сессии
Zend_Auth::getInstance(); // instance for users
Zend_Auth_Admin::getInstance(); // instance for admins