如何检测角色的特定拒绝?

时间:2011-08-17 12:32:33

标签: php zend-framework jquery-ui-sortable acl zend-acl

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 :(得分:0)

好的,所以假设我提出问题,这就是你要找的东西吗? 如果没有,请更好地解释一下这个问题,以便我能提供更好的帮助。

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

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

答案 1 :(得分:0)

好的,我自己通过Zend_Acl代码找到了解决方案,它出来是Zend_Acl缺少isDenied()方法,它有isAllowed()但不是isDenied()

继承我在类中扩展Zend_Acl

的isDenied()方法的实现
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;
    }