0

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

4

2 回答 2

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;
    }
于 2011-09-19T02:50:41.960 回答
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

于 2011-08-17T18:18:49.570 回答