Динамический пользовательский ACL в zend framework?

Мне нужно решение, в котором аутентифицированным пользователям разрешен доступ к определенным контроллерам / действиям, основанным не на их типе пользователя: ie. admin или обычный пользователь (хотя я могу добавить это, используя стандартный ACL позже), но в соответствии с текущим статусом своего пользователя.

Например :

Были ли они участником сайта более 1 недели?

Они полностью заполнили свой профиль?

Собственно, теперь, когда я думаю об этом, вроде как на этом сайте с их привилегиями и значками.

Related of "Динамический пользовательский ACL в zend framework?"

Для динамических тестов на основе условий, которые вы описываете, вы можете использовать динамические утверждения в своих правилах Zend_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 } } 

Затем при определении вашего объекта Acl:

 $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 полностью заполняется к тому времени, когда вы дойдете до контроллеров, где, предположительно, вы будете их проверять.

Просто вслух.