Zend_Acl,如何检查具有多个角色的用户以进行资源访问

时间:2013-01-26 19:01:55

标签: zend-framework zend-acl


   我正在为我的应用程序实现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个角色的权限。

1 个答案:

答案 0 :(得分:10)

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

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);
    }
}