Как определить конкретное отклонение роли?

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.


person Mr Coder    schedule 17.08.2011    source источник


Ответы (2)


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

psuedo-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

person Francis Yaconiello    schedule 17.08.2011
comment
Я добавлю код, чтобы это произошло, как только я узнаю, что это проблема, которую вы хотите решить. - person Francis Yaconiello; 17.08.2011
comment
да, это то, чего я тоже с нетерпением жду. Если вы можете предоставить реализацию is_specifically_denied_permission (), это было бы моим решением. - person Mr Coder; 18.08.2011
comment
Еще один вопрос, храните ли вы пользователей / группы / права доступа к группе в базе данных или это настроено в файле? если бы БД мог бы вы выставить схему? - person Francis Yaconiello; 18.08.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;
    }
person Mr Coder    schedule 19.09.2011