2011-03-12 38 views
2

存在一種情況:我將一些結構化數據(例如數組或對象,或者甚至字符串)存儲爲Zend_Auth標識。從版本到版本,身份結構可以改變,因此一個版本的身份可以(或不可以)與另一個版本的應用程序代碼兼容。Zend_Auth身份版本

我想有一個能力來驗證存儲的身份數據是否符合當前版本的要求。

當我從手動看到的,是否存在身份驗證等進行:

$auth = Zend_Auth::getInstance(); 
if ($auth->hasIdentity()) { 
    // Identity exists; get it 
    $identity = $auth->getIdentity(); 
} 

但是沒有掛接到hasIdentity()方法的能力或其他地方進行驗證。

我看到要做到這一點的唯一方法是實現我自己的Zend_Auth_Storage_Interface類,它將使用一些其他存儲作爲實現並執行存儲數據的驗證。

有沒有更合適的解決方案?

回答

2

我不完全確定要理解,但它看起來像誤解了授權和身份驗證之間的區別。

Zend_Auth是關於身份驗證,因此您應該而不是使用Zend_Auth來處理授權但Zend_Acl。

但是,如果你想要的是存儲從認證過程(即數據庫認證)的附加信息,您可以使用getResultRowObject($returnColumns, $ommitColumns);方法。

根據您當前的適配器,有幾種實現來獲取「行對象」。

Zend_Auth_Storage_Interface是關於存儲結果,我不認爲你需要做這樣的實現,因爲它是關於在會話或數據庫中存儲身份對象。

你可能想要的是使用Zend_Acl中,構建其一般定義角色的訪問控制列表可以是用戶),一個資源您的版本-ED申請),一個特權可以使用或不能


注: *大多數人有困難,使用ž end_Acl是因爲他們在模塊/控制器/操作中思考,但它只是定義資源的一種方法。
資源可以是任何你想要的,一個完整的應用程序,一個控制器動作,視圖,另一個用戶,數據庫連接等*

+0

你完全正確。我使用Zend_Auth對用戶進行身份驗證,並使用Zend_Acl對其進行授權(在preDispatch上過濾導航和驗證權限)。 但我怎麼能通過Zend_Acl確定身份是錯誤的?它是否意味着該用戶沒有任何權限或類似的東西? – 2011-03-12 13:49:56

+0

更具體一點:該網站只包含會員區。這意味着當用戶未登錄時,必須顯示登錄表單而不是任何頁面。否則,當用戶登錄時,他應該看到他被允許訪問的那部分網站。所以可能在錯誤身份的情況下,我必須確定用戶的角色爲「匿名」,而不是將其作爲匿名進行處理。 – 2011-03-12 14:01:55

+0

你是對的,因爲角色的工作原理,你可以從較不寬容的角色繼承他們到最強大的角色。我通常使用guest作爲我的起始角色,具有訪問登錄頁面和登錄的唯一權限,然後提升權限。 – 2011-03-12 14:12:08

0

即使你接受了答案上面我相信你需要別的東西。

$auth = Zend_Auth::getInstance(); 
if ($auth->hasIdentity()) { 
    // Identity exists - validate if it's valid 

    $identity = $auth->getIdentity(); 
    if (!HelperClass::validateIdentity($identity)) { //you validation method 
     /* User has stored identity from previous version. 
      * It may miss some important info (like a role value 
      * you added recently). Clear it and require re-login. */ 
     $auth->clearIdentity(); 
     $this->_helper->flashMessenger('Please login ...'); 
     $this->_helper->redirector('login'); 
    } 
    // identity is valid 
    $acl = Acl::factory(); //get acl object somehow 
    if (!$acl->isAllowed($module.$controller.$action, $identity->role)) { 
     throw new AccessDeniedException(); 
    } 
    // else nothing -> user has valid session data and is allowed to access the resource. 
} 
+0

沒錯,但我希望「當前用戶是否已登錄」的邏輯被封裝在某個特定位置。這將允許在多個地方重複使用該邏輯,而沒有風險可以釋放某些事物。 Acl似乎是那個地方的無情。在你的hasIdentity()驗證示例中,它的驗證分佈在兩個不同的類(代碼片斷)之間,這使得邏輯更加緊密。 – 2011-03-12 16:52:36

+3

AcL不適合IMO。 ACL接收登錄用戶並決定用戶是否可以訪問某些資源。它不應該決定用戶是否登錄... – 2011-03-13 12:20:56