用于控制面板的独立Zend应用程序?

时间:2011-07-15 07:19:49

标签: php zend-framework zend-auth zend-application

我应该为Web应用程序的用户后端创建一个单独的Zend应用程序吗?

我主要担心的是我必须在公共网站(客户登录)和员工管理网站上单独使用Zend_Auth。

由于在我看来我不能在一个应用程序中使用多个Zend_Auth实例,这将是唯一的解决方案。

下一个问题是两个Zend_Auth会话会因为它们在同一个网站空间上运行而发生冲突吗?

干杯

2 个答案:

答案 0 :(得分:2)

实际上,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;
    }    
}

答案 1 :(得分:1)

Zend_Auth实现Singleton Pattern,因此只能存在此类的一个实例。

要区分当前身份是管理员还是用户,您可以使用isAdmin-Flag,甚至更好地实施Zend_Acl_Role_Interface

如果您的应用程序确实需要同时拥有两个Auth-Sessions(一个用户,一个用于Admin),您可以通过扩展它来“复制”Zend_Auth类并调整会话存储。 / p>

<?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