Yii支持RBAC(Role-Based Access Control),结合filter,就给我们提供了非常简单方便的权限控制方法。
其实RBAC的原理很简单。
先梳理一下默认的Yii的授权filter:accessControl。它是根据accessRules按照用户的身份(users)来验证并授权的,默认的有*(任何用户),@(通过登录验证的用户),admin(管理员)。通过一系列这些accessRules,指定了这三种身份用户的各自可调用的action的权限。
而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。
可能比较麻烦的就是初始化RBAC。换句话说,就是怎样才能告诉系统,我需要设定那些角色和操作等等。
这里我使用了一个extension叫SRBAC。可以按照文档很轻松地将这个扩展加入到web应用中。
sbrac很不错的功能是,根据你现有的controllers能够很智能地生成tasks以及operations。同时通过图形化的界面,可以方便地设定roles,tasks和operations的关系。这些roles,tasks.operations和他们之间的关系,都放在数据库里。
对应的数据库配置在config/main.php中:
‘components’=>array(
……
‘authManager’=>array(
‘class’=>’CDbAuthManager’,
‘connectionID’=>’db’,
‘itemTable’=>’rbac_items’,
‘assignmentTable’=>’rbac_assignments’,
‘itemChildTable’=>’rbac_itemchildren’,
),
……
),
‘authManager’=>array(‘class’=>’CDbAuthManager’,‘connectionID’=>’db’,// ‘defaultRoles’=>array(’Trainer’,'authenticated’, ‘Guest’),‘itemTable’=>’rbac_items’,‘assignmentTable’=& gt;’rbac_assignments’,‘itemChildTable’=>’rbac_itemchildren’,),表的内容很简单,一看就明白了就不多说了。srbac的使用其实也很简单,感觉也不必多说。
通过srbac,可以对现有的用户、role、task、operation进行管理。
在你自己的controller中,你也可以通过访问数据库来修改权限。
这里可以使用一个现成的model,就是srbac中的models/Assignments.php来改变用户和role的关系。比如我在新建一个用户的时候,可以:
$auth = new Assignments;
$auth->itemname = $model->type;
$auth->userid = $model->id;
$auth->save();
来源:一个不错的博客:
Yii扩展srbac配置
下载 srbac
Srbac 可以在如下地址下载:
Yii 扩展页面:
Google 项目页面:
也可以使用如下命令签出最新的开发代码:
svn checkout srbac-read-only
安装 srbac要安装 srbac 模块,首先解压压缩文件到Yii应用的模块目录,如果把srbac作为一个模块的话,就要在protected文件夹下新建一个文件夹modules,然后把解压得到的文件夹复制过来。
然后编辑配置文件如下:
在protected/config/main中
首先应该有db的配置:
1 'db'=>array(
2 'connectionString' => 'mysql:host=localhost;dbname=blog',
3 'emulatePrepare' => true,
4 'username' => 'root',
5 'password' => 'guohao',
6 'charset' => 'utf8',
7 'tablePrefix' => 'tbl_',
8 ),
9
10 配置authManager组件:
11 'authManager'=>array(
12 'class'=>'CDbAuthManager',// Manager 的类型
13 'connectionID'=>'db',//使用的数据库组件
14 'itemTable'=>'items',// 授权项目表 (默认:authitem)
15 'assignmentTable'=>'assignments',// 授权分配表 (默认:authassignment)
16 'itemChildTable'=>'itemchildren',// 授权子项目表 (默认:authitemchild)
17 ),
18 items,assignments,itemchildren三个表的名字可随意改动。表结构请到framework/web/auth/schema.sql
19
20 'modules'=>array(
21 'srbac' => array(
22 'userclass'=>'User', //可选,默认是 User
23 'userid'=>'id', //可选,默认是 userid
24 'username'=>'username', //可选,默认是 username
25 'debug'=>true, //可选,默认是 false
26 'pageSize'=>10, //可选,默认是 15
27 'superUser' =>'Authority', //可选,默认是 Authorizer
28 'css'=>'srbac.css', //可选,默认是 srbac.css
29 'layout'=>
30 'application.views.layouts.main', //可选,默认是
31 // application.views.layouts.main, 必须是一个存在的路径别名
32 'notAuthorizedView'=>
33 'srbac.views.authitem.unauthorized', // 可选,默认是unauthorized.php
34 //srbac.views.authitem.unauthorized, 必须是一个存在的路径别名
35 'alwaysAllowed'=>array( //可选,默认是 gui
36 'SiteLogin','SiteLogout','SiteIndex','SiteAdmin',
37 'SiteError', 'SiteContact'),
38 'userActions'=>array(//可选,默认是空数组
39 'Show','View','List'),
40 'listBoxNumberOfLines' => 15, //可选,默认是10
41 'imagesPath' => 'srbac.images', //可选,默认是 srbac.images
42 'imagesPack'=>'noia', //可选,默认是 noia
43 'iconText'=>true, //可选,默认是 false
44 'header'=>'srbac.views.authitem.header', //可选,默认是
45 // srbac.views.authitem.header, 必须是一个存在的路径别名
46 'footer'=>'srbac.views.authitem.footer', //可选,默认是
47 // srbac.views.authitem.footer, 必须是一个存在的路径别名
48 'showHeader'=>true, //可选,默认是false
49 'showFooter'=>true, //可选,默认是false
50 'alwaysAllowedPath'=>'srbac.components', //可选,默认是 srbac.components
51 // 必须是一个存在的路径别名
52 ),
53
54 ),