Мне нужно решение, в котором аутентифицированным пользователям разрешен доступ к определенным контроллерам / действиям, основанным не на их типе пользователя: ie. admin или обычный пользователь (хотя я могу добавить это, используя стандартный ACL позже), но в соответствии с текущим статусом своего пользователя.
Например :
Были ли они участником сайта более 1 недели?
Они полностью заполнили свой профиль?
Собственно, теперь, когда я думаю об этом, вроде как на этом сайте с их привилегиями и значками.
Для динамических тестов на основе условий, которые вы описываете, вы можете использовать динамические утверждения в своих правилах 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 полностью заполняется к тому времени, когда вы дойдете до контроллеров, где, предположительно, вы будете их проверять.
Просто вслух.