2011-12-17 34 views
1

我需要一個解決方案,允許經過身份驗證的用戶訪問特定的控制器/操作,而不是基於其用戶類型:即。管理員或普通用戶(儘管我可以稍後使用標準ACL添加),但根據用戶的當前狀態。zend框架中的動態自定義ACL?

例如:

他們是否得到了網站的會員超過1星期?

他們是否填寫完整的個人資料?

其實,現在我想到了它,就像他們在這個網站上有他們的特權和徽章。

回答

1

對於您所描述的基於動態條件的測試,您可以在Zend_Acl規則中使用dynamic assertions。在定義ACL對象時

class My_Acl_IsProfileComplete implements Zend_Acl_Assert_Interface 
{ 
    protected $user; 

    public function __construct($user) 
    { 
     $this->user = $user; 
    } 

    public function assert(Zend_Acl $acl, 
          Zend_Acl_Role_Interface $role = null, 
          Zend_Acl_Resource_Interface $resource = null, 
          $privilege = null) 
    { 
     // check the user's profile 
     if (null === $this->user){ 
      return false; 
     } 
     return $this->user->isProfileComplete(); // for example 
    } 
} 

然後:

例如

$user = Zend_Auth::getInstance()->getIdentity(); 
$assertion = new My_Acl_Assertion_IsProfileComplete($user); 
$acl->allow($role, $resource, $privilege, $assertion); 

當然,一些細節取決於你需要檢查你可以用什麼什麼細節取決於您在Zend_Auth::setIdentity()調用中存儲的內容 - 僅用戶標識,完整用戶對象等。角色,資源和權限完全是特定於應用程序的。但希望這給出了這個想法。

此外,由於聲明對象需要實例化用戶對象,因此無法在Bootstrap中添加此動態規則。但是,您可以在引導過程中使用靜態規則創建核心Acl實例,然後註冊一個前端控制器插件(例如運行於preDispatch()),添加動態斷言。通過這種方式,當您到達您的控制器時,Acl會完全填充您的控制器,據推測您會檢查它們。

只想大聲。

+0

嗨 - 只是想知道如果你見過/使用動態斷言產生的角色特定條件?例如,在OP的問題中,「該網站的會員超過1周」可能是該網站的會員,超過$ n周,其中每個角色的$ n是不同的,所以管理員可以在'$ n> = 0'周訪問,主持人可能是'$ n> = 1',實際成員可能是'$ n> = 4' ... – boatingcow

+0

我從未見過它是一個有趣的問題,但似乎這樣的規則可以被編纂爲角色名稱上的一個數組,並且所需的週數足以被認爲是「足夠長」,這個數組可以被分成動態斷言,也許是一個可選的構造函數參數(具有理性默認值),然後當動態聲明的'assert()'方法最終被調用時,它具有基於角色的規則(來自實例化)和角色(作爲'assert )'簽名),這應該就夠了 –

+0

這就是我在想什麼,我問了一個問題,然後回來http://stackoverflow.com/quest 7526855/how-to-codify-and-store-dynamic-permission-constraints,但沒有真正得到更多。在這種類型的東西上找到更多的資源會很好! – boatingcow