2011-09-05 49 views
1

我無法讓我的Zend_Navigation正常工作,在Zend Framework PHP中使用Zend_ACL在Zend_Navigation中分配多個角色?

當使用AUth/Doctrine登錄用戶時,我從多對多中抽出分配給用戶的角色(通​​常是少數)很多表,

然後在bootstrap.php上: $ view-> navigation($ navContainer) - > setAcl($ this - > _ acl) - > setRole($ this - > _ role);

我收到錯誤: '$角色必須是字符串,null或Zend_Acl_Role_Interface的實例;數組給定」

但是如果我遍歷用foreach的角色 - 以前的角色正在由以下物質覆蓋,我得到的資產淨值僅爲去年的角色,

有沒有人有這方面的任何合理的解決方案?

真的很感激, 亞當

回答

1

我有同樣的問題,但是從稍微不同的角度處理解決方案。我沒有修改Zend_Navigation對象來接受兩個或更多角色,而是擴展了Zend_Acl並修改了isAllowed()方法來檢查所有這些角色。 Zend_Navigation對象使用isAllowed()方法,因此重寫此問題可解決此問題。

My_Acl.php

<pre><code> 
class My_Acl extends Zend_Acl 
{ 
    public function isAllowed($role = null, $resource = null, $privilege = null) 
    { 
     // Get all the roles to check against 
     $userRoles = Zend_Registry::get('aclUserRoles'); 
     $isAllowed = false; 

     // Loop through them one by one and check if they're allowed 
     foreach ($userRoles as $role) 
     { 
      // Using the actual ACL isAllowed method here 
      if (parent::isAllowed($role->code, $resource)) 
      { 
       $isAllowed = true; 
      } 
     } 

     return $isAllowed; 
    } 
} 
</code></pre> 

然後,而不是創造的Zend_Acl一個實例,使用My_Acl,傳遞到你的瀏覽對象,它應該工作。

0

你真的應該永遠不會覆蓋isAllowed(),並且是有一個解決方案。創建一個實現Zend_Acl_Role_Interface的類,如果內存爲它提供服務,它需要定義一個方法getRole(),事實上,這可能是您用來對用戶進行身份驗證的模型,並允許該類處理確定角色。用戶應該只有一個角色。如果應該授予對多個角色的用戶的資源訪問權限,但只有在某些條件下,才應該使用斷言,這就是爲什麼他們在那裏。