我需要一個解決方案,允許經過身份驗證的用戶訪問特定的控制器/操作,而不是基於其用戶類型:即。管理員或普通用戶(儘管我可以稍後使用標準ACL添加),但根據用戶的當前狀態。zend框架中的動態自定義ACL?
例如:
他們是否得到了網站的會員超過1星期?
他們是否填寫完整的個人資料?
其實,現在我想到了它,就像他們在這個網站上有他們的特權和徽章。
我需要一個解決方案,允許經過身份驗證的用戶訪問特定的控制器/操作,而不是基於其用戶類型:即。管理員或普通用戶(儘管我可以稍後使用標準ACL添加),但根據用戶的當前狀態。zend框架中的動態自定義ACL?
例如:
他們是否得到了網站的會員超過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會完全填充您的控制器,據推測您會檢查它們。
只想大聲。
嗨 - 只是想知道如果你見過/使用動態斷言產生的角色特定條件?例如,在OP的問題中,「該網站的會員超過1周」可能是該網站的會員,超過$ n周,其中每個角色的$ n是不同的,所以管理員可以在'$ n> = 0'周訪問,主持人可能是'$ n> = 1',實際成員可能是'$ n> = 4' ... – boatingcow
我從未見過它是一個有趣的問題,但似乎這樣的規則可以被編纂爲角色名稱上的一個數組,並且所需的週數足以被認爲是「足夠長」,這個數組可以被分成動態斷言,也許是一個可選的構造函數參數(具有理性默認值),然後當動態聲明的'assert()'方法最終被調用時,它具有基於角色的規則(來自實例化)和角色(作爲'assert )'簽名),這應該就夠了 –
這就是我在想什麼,我問了一個問題,然後回來http://stackoverflow.com/quest 7526855/how-to-codify-and-store-dynamic-permission-constraints,但沒有真正得到更多。在這種類型的東西上找到更多的資源會很好! – boatingcow