2010-09-27 66 views
1

我正在研究一个现有的项目,该项目有两个可以登录的区域。管理部分和前端。重构Zend_Auth实现

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

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

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

我想让它成为管理员可以登录到管理部分并以特定的前端用户身份登录。因此可以在网站的两个部分之间来回切换,而无需重新登录。

在Zend Framework中处理这个问题的最好方法是什么?

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

目前,作为前端用户登录导致admin用户必须重新登录才能访问管理区域。这是因为一些$ _SESSION凭证被覆盖?我是否需要以某种方式创建一个自定义$ _SESSION变量来处理ZF方式?我不能直接给$ _SESSION ['front_end']或$ _SESSION ['admin'](我今天会这样做)直接赋值,所以我怎么在Zend Framework中做到这一点? ?

谢谢!

回答

1

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

如果你真的需要两次登录,这当然应该是可能的。默认情况下,Zend_Auth使用类Zend_Auth_Storage_Session来存储会话中的认证结果。此类默认使用会话名称空间'Zend_Auth'(即数据存储在$_SESSION['Zend_Auth']中),所以当您的前端用户成功登录到管理员时,他们的会话身份验证数据将被管理员身份验证结果覆盖。所以你想要做的就是让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']为admin登录和前端的人默认$_SESSION['Zend_Auth']