【问题标题】:Zend_Acl, How to check a user with multiple roles for resource accessZend_Acl,如何检查具有多个角色的用户的资源访问权限
【发布时间】:2013-01-26 19:01:55
【问题描述】:


我正在为我的应用程序实现 RBAC,一切都从数据库进行管理。

例如,我将所有资源/权限存储在一个名为 permission 的表中,所有角色都存储在 role 表中,以及另一个名为 role_permission 的表中,以定义哪个角色可以访问哪些资源/权限。

使用这种方法的目的是因为我希望应用程序的管理员创建role 并自己分配权限给角色。

应用的用户可以拥有多个角色,例如administratorsupervisorplayerreferee 等。

我为Zend_Acl 创建了一个模型类来添加角色和资源并为其分配权限。

下面是我所做的。

foreach($this->_roles as $role) {
    $this->addRole(new Zend_Acl_Role($role['id']));
}
foreach($this->_permissions as $permmission) {
    $this->addResource(new Zend_Acl_Resource($permmission['id']));
}
foreach($this->_rolePermissions as $value) {
    $this->allow($value['role_id'], $value['permmission_id']);
}
$this->allow($this->_roleAdmin);

如果我想检查特定角色是否存在权限,例如通过使用此代码,它可以正常工作。

echo $acl->isAllowed($role, $permission) ? 'allowed' : 'denied';

但是我想检查多个角色是否存在具有多个角色的用户的当前权限。

我应该如何检查具有多个角色(例如refereesupervisor)的用户是否有权访问资源create report。使用 isAllowed() 您只能检查 1 个角色的权限。

【问题讨论】:

  • 已经有一段时间了,但是 IIRC Zend_ACL 是分层的,所以你会在某个时候扮演角色,它会解决基于树的权限......当然,如果你的角色是不同的树,那么没有帮助...

标签: zend-framework zend-acl


【解决方案1】:

我通常采用的方法是创建一个扩展Zend_Acl 的类,并扩展isAllowed() 函数,以便它可以将我的用户对象作为参数。然后它遍历该用户的角色,为每个角色执行检查。例如:

public function isAllowed($roleOrUser = null, $resource = null, $privilege = null)
{
    if ($roleOrUser instanceof Users_Model_User) {
        // check each of that user's roles
        foreach ($roleOrUser->roles as $role) {
            if (parent::isAllowed($role, $resource, $privilege)) {
                return true;
            }
        }

        return false;
    } else {
        return parent::isAllowed($roleOrUser, $resource, $privilege);
    }
}

【讨论】:

  • 我正在尝试创建一种可扩展的方式,因此如果可能,我会尝试删除循环。有没有办法从 acl 对象访问给定资源允许的所有角色?这样我就可以检查我的角色数组,看看它是否是允许访问资源的角色之一。
  • 这样的方法仍然需要遍历角色并连续检查它们。大概用户没有那么多角色,所以我怀疑这会是任何形式的性能问题。
  • 如果有人在扩展时遇到问题;这个页面帮助了我laravel.com/docs/5.0/extending
  • 聪明的解决方案,可能会更干净地拆分成像isUserAllowed($user, $resource = null, $privilege = null)或类似的单独方法,但它有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-01
  • 2019-05-03
  • 2013-04-15
  • 1970-01-01
  • 2013-08-28
  • 2019-05-11
  • 1970-01-01
相关资源
最近更新 更多