Yii提供了强大的配置机制和很多现成的类库。在Yii中使用RBAC是很简单的,完全不需要再写RBAC代码。
一、设置参数
打开protected/config/main.php配置文件
(1)连接数据库
'db'=>array(
'connectionString' => 'mysql:host=localhost;dbname=testdrive',
'emulatePrepare' => true,
'username' => 'root',
'password' => 'root',
'charset' => 'utf8',
'tablePrefix' =>'tbl_', //表前缀
),
(2)配置authManager组件——在'components'=>array()中
//加入RBAC权限控制
'authManager'=>array(
'class'=>'CDbAuthManager',//认证类名称
'connectionID'=>'db',//使用的数据库组件
'defaultRoles'=>array('guest'),//默认角色
'itemTable' => 'authitem',//认证项表名称
'itemChildTable' => 'authitemchild',//认证项父子关系
'assignmentTable' => 'authassignment',//认证项赋权关系
),
在'modules'=>array()里面添加
// uncomment the following to enable the Gii tool
/*
'gii'=>array(
'class'=>'system.gii.GiiModule',
'password'=>'Enter Your Password Here',
// If removed, Gii defaults to localhost only. Edit carefully to taste.
'ipFilters'=>array('127.0.0.1','::1'),
),
*/
'srbac' => array(
'userclass'=>'User', //可选,默认是 User
'userid'=>'id', //可选,默认是 userid
'username'=>'username', //可选,默认是 username
'debug'=>true, //可选,默认是 false
'pageSize'=>15, //可选,默认是 15
'superUser' =>'Authority', //可选,默认是 Authorizer
'css'=>'srbac.css', //可选,默认是 srbac.css
'layout'=>
'application.views.layouts.main', //可选,默认是
// application.views.layouts.main, 必须是一个存在的路径别名
'notAuthorizedView'=>'srbac.views.authitem.unauthorized', // 可选,默认是unauthorized.php
//srbac.views.authitem.unauthorized, 必须是一个存在的路径别名
'alwaysAllowed'=>array( //可选,默认是 gui
'SiteLogin','SiteLogout','SiteIndex','SiteAdmin',
'SiteError', 'SiteContact'
),
'userActions'=>array(//可选,默认是空数组
'Show','View','List'
),
'listBoxNumberOfLines' => 10, //可选,默认是10
'imagesPath' => 'srbac.images', //可选,默认是 srbac.images
'imagesPack'=>'noia', //可选,默认是 noia
'iconText'=>true, //可选,默认是 false
'header'=>'srbac.views.authitem.header', //可选,默认是
// srbac.views.authitem.header, 必须是一个存在的路径别名
'footer'=>'srbac.views.authitem.footer', //可选,默认是
// srbac.views.authitem.footer, 必须是一个存在的路径别名
'showHeader'=>true, //可选,默认是false
'showFooter'=>true, //可选,默认是false
'alwaysAllowedPath'=>'srbac.components', //可选,默认是 srbac.components
// 必须是一个存在的路径别名
),
(3)srbac作为一个模块,所以要声明一下才能使用。
'import'=>array(
'application.modules.srbac.controllers.SBaseController',
),
二、建立数据库
(1)先建立数据库,要与之前配置文件中写的数据库名称,用户名,密码要一致
(2)找到yii目录下的sql文件yii\framework\web\auth\schema-mysql.sql文件
打开文件对里面将要建立的表的名称根据自己的需求进行相应的修改与之前配置文集中的表名要一致,点击查询在查询里面运行该sql语句或者运行该sql文件
三、写好用户User的model,即参与的用户表
需要建立数据库user表在写model文件,数据库的表名称和字段名称要和配置文件中的一致
class User extends CActiveRecord
{
public $id;
public $username;
public $password;
public $email;
/**
* Returns the static model of the specified AR class.
* @param string $className active record class name.
* @return User the static model class
*/
public static function model($className=__CLASS__)
{
return parent::model($className);
}
/**
* @return string the associated database table name
*/
public function tableName()
{
return '{{user}}';
}
}
?>
四、访问安装srbac地址,解压srbac
访问地址, http://yii.net/index.php?r=srbac/authitem/install
,我在Apache中配置了虚拟目录和写了host所以开头是yii.net,按照自己的访问路径来,但是后面的 srbac/authitem
是一样的
如果配置正确可以看到这个页面:
点击install如果出现以下问题,说明配置存在问题
如果出现以下页面说明配置成功了
五、成功之后即可进入管理页面
http://yii.net/index.php?r=srbac/authitem/assign
配置成功之后会进入这个页面
(1)注释掉srbac的安装,否则每次访问都会进入安装页面
然后找到protected/modules/srbac/controllers/AuthitemController.php
找到一下几句话注释掉(大约在43行):
// if (!$this->module->isInstalled() && $action->id != "install") {
// $this->redirect(array("install"));
// return false;
// }
因为这个地方判断每次都是新安装srbac。当你安装完成后,这里就没用了。可以注释掉了。
protected\modules\srbac\views\authitem\下的install文件可以删掉了,这个是在安装srbac时用到的页面
(2)SRBAC的汉化
SRBAC已经有中文语言包,在srbac/messages/zh,
在main.php配置文件中加入'language'=>'zh_cn',
六、安装成功之后的使用
(1)了解role、task、operation三个概念(来自: http://www.yiichina.com/tutorial/46
)
你需要了解的是,授权项目可分为operations(行动),tasks(任务)和 roles(角色)。
一个用户拥有一个或者多个角色,比如,我们这里有三个角色:银行行长、银行职员、顾客。我们假设:
那么,相应的,只要顾客可以做的事情,小李就可以做,王职员和张行长也可以。银行职员可以做的事情,王职员和张行长都可以做,小李就不可以了。
比如,一个“顾客”可以存钱,那么拥有“顾客”角色的张行长、王职员、小李都可以存钱。“银行职员”可以打印顾客的交易记录,那么有“银行职员”角 色的张行长和王职员都可以,而小李不行,必须找一个有“银行职员”角色的人才可以打印详细的交易记录。一个“银行行长”才可以进入银行钱库提钱,那么只有 张行长可以,因为它才有“银行行长”的角色。
这就是基于角色的认证体系,简称RBAC。
角色的继承
角色是可以继承的,比如我们规定如下:
那么角色关系就变成了:
-
张行长 有角色:银行行长。
-
王职员 有角色:银行职员。
-
小李 有角色:顾客。
这样更简单了,这就是角色的继承。
任务的继承
一个任务(task)是可以包含另外一个任务的,我们举个例子,比如“进入银行”。
我们设定“顾客”这个角色有“进入银行”的权限。也就是说,“顾客”可以执行“进入银行”的任务。接下来,我们假设“进入柜台”是进入银行的父权 限,也就是说,“进入柜台”包含“进入银行”。只要能“进入柜台”的人都可以“进入银行”。我们把“进入柜台”这个任务权限给“银行职员”。
那么从角色上来说,王职员可以进入银行,因为王职员的角色是“银行职员”,而“银行职员”包含了“顾客”的角色。那么“顾客”可以进行的“任务”对于“银行职员”来说也是可以进行的。而“顾客”可以“进入银行”,那么王职员也可以“进入银行”。这是角色的继承带来的。
我们再假设有个赵领导,是上级领导,可以进入柜台进行视察。那么,我们的任务关系是:
那么,赵领导就可以“进入银行”。因为“进入银行”是被“进入柜台”包含的任务。只要可以执行“进入柜台”的人都可以执行“进入银行”。这就是任务的继承。
关于行动
行动是不可划分的一级。也就是说。而一个行动是不能包含其他行动的。假设我们有个行动叫“从银行仓库中提钱”。我们把这个行动作包含“进入柜台”。那么只要可以执行“从银行仓库中提钱”的角色都可以执行“进入柜台”这个任务。
三者关系
-
一个角色可以包含另外一个或者几个角色。
-
一个角色可以包含另外一个或者几个任务。
-
一个角色可以包含另外一个或者几个行动。
-
一个任务可以包含另外一个或者几个任务。
-
一个任务可以包含另外一个或者几个行动。
- 一个行动只能被角色或者任务包含,行动是不可以包含其他,也不可再分。
这样,就形成了一个权限管理体系。关于“任务”和“行动”,你不必思考其字面上的意义。这两者就是形成两层权限。
进行赋权
(2)添加以及分配权限
可以在管理授权项里面添加role、operation、task
在分配授权项里面给用户分配role,给role非配task,给他task分配operation
可以在用户已经获授权里面通过输入用户名查看给用户所获得的权限