【问题标题】:How to detect specific deny on a role?如何检测角色的特定拒绝?
【发布时间】:2011-08-17 12:32:32
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    好的,假设我理解了这个问题,您正在寻找这样的东西吗? 如果没有,请更好地解释这个问题,以便我可以提供更好的帮助。

    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
    

    【讨论】:

    • 一旦我知道这是您要解决的问题,我将添加实际代码来实现这一点
    • 是的,这也是我所期待的。如果您可以提供“is_specifically_denied_permission()”实现,那将是我的解决方案。
    • 还有一个问题,您是将用户/组/组权限存储在数据库中还是将其设置在文件中?如果 DB 可以建立一个模式?
    【解决方案2】:

    好的,我自己通过进入 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;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-25
      • 2011-02-10
      • 2018-10-03
      • 1970-01-01
      • 2013-03-28
      • 1970-01-01
      • 2011-10-19
      • 2021-08-16
      相关资源
      最近更新 更多