我正在为我的应用程序实现RBAC,一切都是从数据库管理的。
例如,我将所有资源/权限存储在名为permission
的表中,所有角色存储在role
表中,另一个表称为role_permission
以定义哪个角色可以访问哪些资源/权限。
采用这种方法的目的是因为我希望应用程序的管理员创建role
并自行为角色分配权限。
该应用的用户可以拥有多个角色,例如administrator
,supervisor
,player
,referee
等。
我为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个角色的权限。
答案 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);
}
}