6


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

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

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

应用程序的用户可以具有多个角色,例如administrator, supervisor,playerreferee

我创建了一个模型类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';

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

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

4

1 回答 1

10

我通常采用的方法是创建一个扩展类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);
    }
}
于 2013-01-26T19:09:06.060 回答