2010-09-27 40 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']