重构Zend_Auth实现

时间:2010-09-27 19:35:21

标签: php zend-framework zend-auth

我正在开发一个现有项目,该项目有两个可以登录的区域。管理部分和前端。

目前,admin部分有一个登录操作,前端有自己的登录操作。管理员使用专门用于管理员帐户的数据库表登录,前端使用不同的表一起登录。

如果管理员已登录并尝试登录前端,则系统会提示他们以前端用户身份登录(因为前端用户根据与之关联的项目获得的内容完全不同而且管理员不是与一个特定项目相关联。)

以前端用户身份登录后,他们的管理员凭据消失了,如果他们尝试重新进入管理部分,则必须再次登录。

我想这样做,以便管理员可以登录管理部分并以特定的前端用户身份登录。因此能够在两个部分之间来回切换网站无需重新登录。

在Zend Framework中处理此问题的最佳方法是什么?

到目前为止,我正在考虑丢失单独的登录操作并只有一个(不需要两个,正确吗?)然后我必须处理允许单独的凭据。

目前,以前端用户身份登录会导致管理员用户必须重新登录才能访问管理区域。这是因为某些$ _SESSION凭证被覆盖了吗?我是否需要以某种方式创建一个自定义的$ _SESSION变量来处理这种ZF方式?

显然我不能直接为$ _SESSION ['front_end']或$ _SESSION ['admin'](我当天会做的)分配一个值,那么我如何在Zend Framework中做到这一点?

谢谢!

1 个答案:

答案 0 :(得分:1)

第一个问题,你真的需要这样做吗?假设管理员用户可以访问所有项目,这种类似的方法的典型方法是给管理员一个下拉列表所有项目的前端,并允许他们在它们之间切换。一旦他们选择了一个,这个选择就会存储在他们的会话中,他们可以像访问其中一个用户一样查看数据。然后他们可以随意切换项目。

如果你真的需要两次登录,这肯定是可能的。默认情况下,Zend_Auth使用Zend_Auth_Storage_Session类在会话中存储身份验证结果。此类默认使用会话命名空间'Zend_Auth'(即数据存储在$_SESSION['Zend_Auth']中),因此当您的前端用户成功登录管理员时,他们的会话身份验证数据将被admin身份验证的结果覆盖。所以你想要做的是让Zend_Auth_Storage_Session为管理员登录使用不同的命名空间(或者为每个命名空间使用自定义命名空间)。

理论上你应该能够做到这样的事情:

public function loginAction()
{
    $auth = Zend_Auth::getInstance();
    if (...) { // check some condition that returns true for admin logins
        // setup storage with custom admin namespace (can be any string)
        $authStorage = new Zend_Auth_Storage_Session('Yourapp_Admin_Auth');
    } else {
        // use defaults
        $authStorage = new Zend_Auth_Storage_Session();
    }
    $auth->setStorage($authStorage);

    // carry on login as normal
    [...]
}

所以,这样做是让Zend_Auth使用$_SESSION['Yourapp_Admin_Auth']进行管理员登录,使用默认$_SESSION['Zend_Auth']进行前端登录。