Как обнаружить конкретный отказ на роль? - PullRequest
0 голосов
/ 17 августа 2011

Zend_Acl по умолчанию запрещает каждую роль каждому ресурсу в каждой привилегии до тех пор, пока они специально не разрешены.В моей системе пользователь может иметь много ролей, и на эти роли назначены разрешения.Я просто получаю все пользовательские роли для каждой из них, и проверяю isAllowed () для заданного ресурса и привилегии для каждой роли.

, например, если текущий ресурс равен 'foo', а привилегия 'bar'

public function checkAllow($roles, $resouse, $privilege)
{

    foreach ($roles as $role) {
        if ($acl->isAllowed($role, 'foo', 'bar') === true)
            return true;
    }
    return false;
}

Теперь я хочу реализовать порядок сортировки для этих ролей, т. Е. Первая роль будет иметь большее предпочтение, чем вторая и т. Д.

Возникает проблема, как я могу определить конкретный отказ для некоторых ролей, таких как

$this->deny('member','foo','bar');

Итерируя по всем ролям, как я могу узнать, что данная роль была конкретно "отрицаема"?Так что в этот момент я могу выйти из цикла foreach и вернуть false.

Ответы [ 2 ]

0 голосов
/ 19 сентября 2011

Хорошо. Я сам нашел решение, войдя в код Zend_Acl, и оказалось, что Zend_Acl отсутствует метод isDenied (), имеет isAllowed (), но не isDenied ()

Вот моя реализация метода isDenied () в классе, который расширяет Zend_Acl

public function isDenied($roleId,$resource,$privilege)
    {

        if($this->has($resource) && $this->hasRole($roleId))
        {

         $roleId = $this->getRole($roleId)->getRoleId();
         $resourceId = $this->get($resource)->getResourceId();   

       return @$this->_rules['byResourceId'][$resourceId]['byRoleId'][$roleId]['byPrivilegeId'][$privilege]['type'] === 'TYPE_DENY';
        }

        return false;
    }
0 голосов
/ 17 августа 2011

Хорошо, при условии, что я беру на себя вопрос, что-то вроде этого вы ищете?если нет, пожалуйста, объясните вопрос немного лучше, чтобы я мог помочь лучше.

psuedo-code</p> <pre><code>// User starts without permission $has_permission = false // if any of the users roles have permission set true foreach $user->roles as $role // if any of the user's roles allow this permission if $role->has_permission() == true $has_permission = true // if a user is specifically denied a permission that takes precedence // and immediately kicks the user out if $role->is_specifically_denied_permission() == true return false // return whatever value (true or false) is in $has_permission return $has_permission

...