我应该为 Web 应用程序的用户后端创建一个单独的 Zend 应用程序吗?
我主要担心的是我必须在公共网站(供客户登录)和员工管理网站上都有一个单独的 Zend_Auth。
因为在我看来,我不能在一个应用程序中使用多个 Zend_Auth 实例,这将是唯一的解决方案。
下一个问题是两个 Zend_Auth 会话会因为它们在同一个 web 空间上运行而发生冲突?
干杯
我应该为 Web 应用程序的用户后端创建一个单独的 Zend 应用程序吗?
我主要担心的是我必须在公共网站(供客户登录)和员工管理网站上都有一个单独的 Zend_Auth。
因为在我看来,我不能在一个应用程序中使用多个 Zend_Auth 实例,这将是唯一的解决方案。
下一个问题是两个 Zend_Auth 会话会因为它们在同一个 web 空间上运行而发生冲突?
干杯
实际上,Benjamin Cremer 的解决方案行不通,因为Zend_Auth_Admin
扩展了 Singleton 实现,所以它getInstance()
会产生一个Zend_Auth
实例,而不是一个实例Zend_Auth_Admin
。
我自己也遇到过这种情况,并且看到 ZF 人(至少在 ZF1 中)将身份验证视为应用程序中的单个入口点(他们可以做到这一点,以便 Zend_Auth 可以包含多个实例,在 php 中使用 LSB等),对 Benjamin Cremer 的代码进行了小修改 - 您还必须覆盖 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 实现了单例模式,所以这个类只能存在一个实例。
要区分当前身份是管理员还是用户,您可以使用 isAdmin-Flag,或者更好地实现Zend_Acl_Role_Interface。
如果您的应用程序确实需要同时拥有两个 Auth-Session(一个用于用户,一个用于管理员),您可以通过扩展 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 对象进行 Session 处理
Zend_Auth::getInstance(); // instance for users
Zend_Auth_Admin::getInstance(); // instance for admins