YII framework下基于角色的访问控制(RBAC),权限设置 yii下,filters()和accessControl()是YII基本的访问控制体系, public function filt
YII非rbac通用权限,controller中加权限过滤器beforeaction
-
public
function purview($module, $control, $action) { -
if (!$this->checkPower($action, $control, module)) { -
throw new CHttpException(403, '您没有访问权限!'); -
Yii::app()->end(); -
} -
}
-
-
//
CGRIDVIEW buttonID 'visible' =>'$this->grid->controller->checkPower("delete")', -
public
function checkPower($action, $contrl = null, $module = null) { -
if ($contrl === null) { -
$contrl = $this->getId(); -
} -
-
if ($module === null && $this->getModule()) { -
$module = $this->getModule()->getId(); -
} -
-
return Privilege::model()->checkPower($module, $contrl, $action); -
}
-
public
function beforeAction($action) { -
$contrl = $this->getId(); -
$actionId = $action->getId(); -
$route = $contrl . '/' . $actionId; -
if (!in_array($route, array('site/login', 'site/error', 'site/logout')) && Yii::app()->user->id != 1) { -
$module = null; -
if ($action && $this->getModule()) { -
$module = $this->getModule()->getId(); -
} -
$this->purview($module, $contrl, $actionId); -
} -
return parent::beforeAction($action); -
}
在这里的visible表达式中设置调用$this->checkPower('操作名');就可以隐藏没有权限访问的菜单了
RBAC0 定义了能构成一个RBAC控制系统的最小的元素集合
在RBAC之中,包含用户users(USERS)、角色roles(ROLES)、目标objects(OBS)、操作operations(OPS)、许可权permissions(PRMS)五个基本数据元素,权限被赋予角色,而不是用户,当一个角色被指定给一个用户时,此用户就拥有了该角色所包含的权限。会话sessions是用户与**的角色集合之间的映射。RBAC0与传统访问控制的差别在于增加一层间接性带来了灵活性,RBAC1、RBAC2、RBAC3都是先后在RBAC0上的扩展。
RBAC1 引入角色间的继承关系
角色间的继承关系可分为一般继承关系和受限继承关系。一般继承关系仅要求角色继承关系是一个绝对偏序关系,允许角色间的多继承。而受限继承关系则进一步要求角色继承关系是一个树结构。
RBAC2 模型中添加了责任分离关系
RBAC2 的约束规定了权限被赋予角色时,或角色被赋予用户时,以及当用户在某一时刻**一个角色时所应遵循的强制性规则。责任分离包括静态责任分离和动态责任分离。约束与用户-角色-权限关系一起决定了RBAC2模型中用户的访问许可。
RBAC3 包含了RBAC1和RBAC2
YII提供了2套权限访问系统,一套是简单的filter(过滤器)模式,另一套是复杂全面的RBAC模式,两者之间,前者先于后者。即访问的控制判断机制有个先后顺序:先进行访问控制过滤器的判断,再进行角色访问控制判断。而RBAC和默认的按照users的原理一样。通过指定”roles”来限定对应角色用户的可用action的权限。用”roles”替
换”users”即可,因为Yii的accessControl是支持roles的。通过这种方式,在Contoller内部,通过指定 accessRules就可以控制权限。在其他地方,比如控制一些view的显示的时候,可以用 Yii::app()->user->checkAccess(role)来进行权限判断。
RBAC本身也有特别之处。看官方的一段原话:
在Yii的RBAC的一个基本概念是authorization item(授权项目)。一个授权项目是一个做某事的许可(如创造新的博客发布,管理用户)。根据其粒度和targeted audience, 授权项目可分为operations(行动),tasks(任务)和 roles(角色)。角色包括任务,任务包括行动,行动是许可是个原子。 例如,我们就可以有一个administrator角色,包括post management和user management任务。user management 任务可能包括create
user,update user和delete user行动。为了更灵活,Yii也可以允许角色包括其他角色和动作,任务包括其他任务,行动包括其他行动。
也就是说在Yii::app()->user->checkAccess(role)的时候,role可以是operations,tasks和roles。
rights,srbac可视化配置,自动安装表 http://www.yiiframework.com/extension/srbac/但是一定要弄懂Yii的内部 rbac 因为这扩展个都是建立在这个基础上的.
开始准备
Yii提供了强大的配置机制和很多现成的类库。在Yii中使用RBAC是很简单的,完全不需要再写RBAC代码。所以准备工作就是,打开编辑器,跟我来。 设置参数、建立数据库
在配置数组中,增加以下内容:
srbac
-
'components'
=> array( -
'authManager' => array( -
'class' => 'srbac.components.SDbAuthManager', -
'connectionID' => 'db', //使用的数据库组 -
'itemTable' => 'tbl_items', // 授权项目表 (默认:authitem) -
'assignmentTable' => 'tbl_assignments', // 授权分配表 (默认:authassignment) -
'itemChildTable' => 'tbl_itemchildren', // 授权子项目表 (默认:authitemchild) -
), -
),
注意这里,'class'=>'srbac.components.SDbAuthManager', 手册上写的错了
那这三个数据表怎么建立呢?很简单,去看framework/web/auth/schema.sql。注意要和你的自定义的表名称对应起来。然后在数据库中运行这个SQL文件中的语句。
修改对应的配置
-
'modules'
=> array( -
'srbac' => array( -
'userclass' => 'Member', //default: User -
'userid' => 'mid', //default: userid -
'username' => 'username', //default:username -
****
index.php?r=srbac,安装成功可以删除modules\srbac\views\authitem\install文件夹也可以重命名。然后找到protected\modules\srbac\controllers\AuthitemController.php注释掉beforeAction方法中代码。
-
if
(!$this->module->isInstalled() && $action->id != "install") { -
$this->redirect(array("install")); -
return false; -
}
-
'import'
=> array( -
// rights -
'application.modules.rights.*', -
'application.modules.rights.models.*', -
'application.modules.rights.components.*', // Correct paths if necessary. -
),
-
-
'modules'
=> array( -
'rights' => array( -
//'debug' => true, -
'install' => true, -
//'enableBizRuleData' => true, -
), -
),
-
'components'
=> array( -
'authManager' => array( -
'class' => 'RDbAuthManager', -
'connectionID' => 'db', -
'itemTable' => 'r_auth_item', -
'itemChildTable' => 'r_auth_item_child', -
'assignmentTable' => 'r_auth_assignment', -
'rightsTable' => 'r_rights', -
), -
'user' => array( -
'class' => 'RWebUser', -
), -
)
rights
-
class
Controller extends RController { -
public function filters() { -
return array( -
'rights', -
); -
} -
}
进行赋权
我们建立了RBAC权限管理,就需要进行对权限的WEB管理。这些就需要你自己写代码了。
根据不同种类的项目调用下列方法之一定义授权项目
一旦我们拥有一套授权项目,我们可以调用以下方法建立授权项目关系:
最后,我们调用下列方法来分配角色项目给各个用户:
权限数据的添加
2.
"; echo "
- "; echo "
- Create post: ".Yii::app()->user->checkAccess('createPost')."
- "; echo "
- Read post: ".Yii::app()->user->checkAccess('readPost')."
- "; echo "
- Update post: ".Yii::app()->user->checkAccess('updatePost', array('post' => $post))."
- "; echo "
- Delete post: ".Yii::app()->user->checkAccess('deletePost')."
- "; echo "