我正在为我的应用程序实现RBAC,一切都是从数据库管理的.
例如,我将所有资源/权限存储在名为permission的表中,角色表中的所有角色以及另一个名为role_permission的表中,以定义哪个角色可以访问哪些资源/权限.
采用这种方法的目的是因为我希望应用程序的管理员创建角色并自己为角色分配权限.
该应用的用户可以有多个角色,例如管理员,主管,播放器,裁判等.
我为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';
但是,我想检查具有多个角色的多个角色,具有多个角色的用户是否存在当前权限.
我应该如何检查具有多个角色的用户,例如裁判,主管可以访问资源创建报告.使用isAllowed(),您只能检查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,$privilege);
- }
- }