Динамический пользовательский ACL в Zend Framework? - PullRequest
1 голос
/ 18 декабря 2011

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

Например:

Были ли они на сайте более 1 недели?

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

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

1 Ответ

1 голос
/ 18 декабря 2011

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

Просто мысли вслух.

...