YII RBAC基于角色的访问控制
基于角色的访问控制( Role-Based Access Control ),是一种简单的而又强大的集中访问控制。基于Yii Framework 的 authManager 组件实现了分等级的 RBAC,能够帮助我们解决开发中遇到一些资源控制访问的问题。
Yii的rbac,从开始安装arbc模块扩展,到调试分析其原理,断断续续地也花了不少时间。当然你了解它后,你会发现,yii的abrc是多的方便,可以让你轻松实现资源控制访问,非常强大。现在就整理下学习笔记,分享一下。虽然authMangner组件实现了rbac,但是没有实现可视化编辑管理。目前官方有Srbac 和 Right两个比较好的扩展模块,我们用它们非常方便的可视化管理角色(roles),任务(tasks),操作(operations)。
它们的界面操作风格如下:
对于这两个扩展模块,其实功能都差不多的,只是界面上的不同。看个人喜欢什么风格,就选择那个模块测试。至于安装调试,你只要下载它们,里面有详细介绍。下面我们分析下authManager 组件实现的原理。
授权项目,就是判断一个用户是否允许操作特定的资源,通过检查用户是否属于有权限访问该项资源的角色来判断。这里我们要明白,授权项目,角色,任务,操作之间的关系。
1.授权项目可分为,角色,任务,操作;
2.角色可以由若干个任务组成;
3.任务可以有若干个操作组成;
4.操作就是一个许可,不可在分。
这里也还要提到,业务规则问题,它其实就是一段php代码,在检查权限的时候会被执行。
下面我们分析下rbac实现中,需要三张表:authassignment、authitem、authitemchild的结构:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
/** * authassignment表 * 记录 用户->角色 之间的对应关系 */ itemname varchar(64) 角色名称,区分大小写 userid varchar(64) 用户ID,是自己项目中用户表的id bizrule text 业务规则,一段php code data text 序列化后的数组,用于给bizrule提供参数 /** * authitem 表 * 记录 RBAC 中的对象 */ name varchar(64) authassignment中的itemname相同 type integer 类型标识(0,1,2) | |-------- 0 表示 Operation 操作 |-------- 1 表示 Task 任务 |-------- 2 表示 Role 角色 description text 相关描述 bizrule text 业务规则,一段php code data text 序列化后的数组,用于给bizrule提供参数 /** * authitemchild 表 * 记录 角色->任务 、 角色->操作 和 任务->操作 之间的对应关系 */ parent varchar(64) 父级名称,[角色名,也可以是任务]; children varchar(64) 子对象名称。[任务名,也可以是操作]; |
使用验证方法CWebUser::checkAccess(),下面用一段demo code说明:
1
2
3
4
|
if (Yii::app()->user->checkAccess(what, $params )) { //what --- role,或者task,也可以是operation, //params --- 是传进业务规则的参数key-value; } |
下面就演示一下具体的一个用户删除文章的操作:
1
2
3
4
5
6
7
8
9
10
11
|
/** * role author * Operation delArticle * bizrule return (Yii::app()->user->id==$params['uid']->uid); */ $params = array ( 'uid' => $id ); if (Yii::app()->user->checkAccess( 'delArticle' , $params )) { //检查当前用户是否有删除文章权限 //并且使用业务规则,检查用户id等于文章里面的作者id //通过验证,就执行删除操作 } |