Yii中使用RBAC全然指南
本人小菜鸟一仅仅,为了自我学习和交流PHP(jquery,linux,lamp,shell,javascript,server)等一系列的知识,小菜鸟创建了一个群。
希望光临本博客的人能够进来交流。
寻求共同发展。搭建平台。
本人博客也有很多的技术文档,希望能够为你提供一些帮助。仅仅为交流技术。
QQ群: 191848169 QQ:450225664
写在前面
- 下面内容适合Yii 1.0.x,其它版本号可能有稍微的区别。
- 依据您的评论和反馈,本文会不断进行改动和补充。以方便新学习者。
開始准备
Yii提供了强大的配置机制和非常多现成的类库。在Yii中使用RBAC是非常easy的,全然不须要再写RBAC代码。所以准备工作就是。打开编辑器。跟我来。
设置參数、建立数据库
在配置数组中,添加下面内容:
‘components‘ => array( |
//…… |
‘authManager‘=>array( |
‘class‘=>‘CDbAuthManager‘,//认证类名称 |
‘defaultRoles‘=>array(‘guest‘),//默认角色 |
‘itemTable‘ => ‘pre_auth_item‘,//认证项表名称 |
‘itemChildTable‘ => ‘pre_auth_item_child‘,//认证项父子关系 |
‘assignmentTable‘ => ‘pre_auth_assignment‘,//认证项赋权关系 |
), |
//…… |
那这三个数据表怎么建立呢?非常easy。去看framework/web/auth/schema.sql。注意要和你的自己定义的表名称相应起来。
比方SQL文件里的AuthItem你要改动为pre_auth_item。然后在数据库中执行这个SQL文件里的语句。
了解概念
你可能要问。剩下的代码呢?我告诉你,没有啦。RBAC系统就这样建立起来了。
可是为了使用它,你须要了解它的执行机制。
我会尽量讲的啰嗦一点……(官方的RBAC文档在这里,可是我以前看了4-5遍才明确。
)
三个概念
你须要了解的是,授权项目可分为operations(行动),tasks(任务)和 roles(角色)。
一个用户拥有一个或者多个角色,比方,我们这里有三个角色:银行行长、银行职员、顾客。
我们如果:
- 张行长 有角色:银行行长、银行职员、顾客(人家自己能够存钱嘛)。
- 王职员 有角色:银行职员、顾客。
- 小李 有角色:顾客。
那么,对应的,仅仅要顾客能够做的事情,小李就能够做。王职员和张行长也能够。银行职员能够做的事情。王职员和张行长都能够做,小李就不能够了。
比方。一个“顾客”能够存钱,那么拥有“顾客”角色的张行长、王职员、小李都能够存钱。“银行职员”能够打印顾客的交易记录。那么有“银行职员”角色的张行长和王职员都能够,而小李不行,必须找一个有“银行职员”角色的人才干够打印具体的交易记录。
一个“银行行长”才干够进入银行钱库提钱,那么仅仅有张行长能够,由于它才有“银行行长”的角色。
这就是基于角色的认证体系,简称RBAC。
角色的继承
角色是能够继承的,比方我们规定例如以下:
- 凡是“银行行长”都是“银行职员”,也就是说。仅仅要银行职员能够做的事情。银行行长都能够做。
- 凡是“银行职员”都是顾客,同上,顾客能够做的事情银行职员也能够做。
那么角色关系就变成了:
- 张行长 有角色:银行行长。
- 王职员 有角色:银行职员。
- 小李 有角色:顾客。
这样更简单了。这就是角色的继承。
任务的继承
一个任务(task)是能够包括另外一个任务的,我们举个样例,比方“进入银行”。
我们设定“顾客”这个角色有“进入银行”的权限。
也就是说,“顾客”能够运行“进入银行”的任务。接下来,我们如果“进入柜台”是进入银行的父权限,也就是说,“进入柜台”包括“进入银行”。
仅仅要能“进入柜台”的人都能够“进入银行”。我们把“进入柜台”这个任务权限给“银行职员”。
那么从角色上来说,王职员能够进入银行。由于王职员的角色是“银行职员”,而“银行职员”包括了“顾客”的角色。那么“顾客”能够进行的“任务”对于“银行职员”来说也是能够进行的。
而“顾客”能够“进入银行”,那么王职员也能够“进入银行”。这是角色的继承带来的。
我们再如果有个赵领导。是上级领导,能够进入柜台进行视察。那么,我们的任务关系是:
- 赵领导 有任务:进入柜台。
那么,赵领导就能够“进入银行”。由于“进入银行”是被“进入柜台”包括的任务。仅仅要能够运行“进入柜台”的人都能够运行“进入银行”。这就是任务的继承。
关于行动
行动是不可划分的一级。也就是说。
而一个行动是不能包括其它行动的。如果我们有个行动叫“从银行仓库中提钱”。我们把这个行动作包括“进入柜台”。那么仅仅要能够运行“从银行仓库中提钱”的角色都能够运行“进入柜台”这个任务。
三者关系
- 一个角色能够包括另外一个或者几个角色。
- 一个角色能够包括另外一个或者几个任务。
- 一个角色能够包括另外一个或者几个行动。
- 一个任务能够包括另外一个或者几个任务。
- 一个任务能够包括另外一个或者几个行动。
- 一个行动仅仅能被角色或者任务包括。行动是不能够包括其它。也不可再分。
这样,就形成了一个权限管理体系。关于“任务”和“行动”。你不必思考其字面上的意义。这两者就是形成两层权限。
进行赋权
我们建立了RBAC权限管理,就须要进行对权限的WEB管理。这些就须要你自己写代码了。
依据不同种类的项目调用下列方法之中的一个定义授权项目:
一旦我们拥有一套授权项目,我们能够调用下面方法建立授权项目关系:
最后,我们调用下列方法来分配角色项目给各个用户:
以下我们将展示一个样例是关于用所提供的API建立一个授权等级:
$auth=Yii::app()->authManager; $auth->createOperation('createPost','create a post');
$auth->createOperation('readPost','read a post');
$auth->createOperation('updatePost','update a post');
$auth->createOperation('deletePost','delete a post'); $bizRule='return Yii::app()->user->id==$params["post"]->authID;';
$task=$auth->createTask('updateOwnPost','update a post by author himself',$bizRule);
$task->addChild('updatePost'); $role=$auth->createRole('reader');
$role->addChild('readPost'); $role=$auth->createRole('author');
$role->addChild('reader');
$role->addChild('createPost');
$role->addChild('updateOwnPost'); $role=$auth->createRole('editor');
$role->addChild('reader');
$role->addChild('updatePost'); $role=$auth->createRole('admin');
$role->addChild('editor');
$role->addChild('author');
$role->addChild('deletePost'); $auth->assign('reader','readerA');
$auth->assign('author','authorB');
$auth->assign('editor','editorC');
$auth->assign('admin','adminD');
也就是说,你须要自己写一个管理界面,来列出你的角色、任务、行动,然后能够在这个界面上进行管理。比方添加、删除、改动。
权限检查
如果你在你的管理界面进行了赋权。那么能够在程序里面进行权限检查:
if( Yii::app()->user->checkAccess('createPost') )
{
// 这里能够显示表单等操作
} else {
// 检查没有通过的能够跳转或者显示警告
}
上面的代码就检查了用户能否够运行“createPost”,这createPost可能是一个任务。也能够是一个行动。
其它的
对于非常多说Yii权限体系RBAC不好用的人事实上都没有看懂文档。综合我的体验,我感觉Yii框架的RBAC是我用过的框架里面最好用的。
并且是须要自己写代码最少的。
Yii的RBAC有更加高级的使用方法。比方“业务规则”,“默认角色”。
你能够去參考官方文档。
我知道。会有部分人仍旧不理解RBAC,或者不会用Yii的RBAC。没有关系,你能够在下方的评论框里提问。
happy Yii 。
Yii中使用RBAC全然指南的更多相关文章
- Yii中使用RBAC完全指南
开始准备 Yii提供了强大的配置机制和很多现成的类库.在Yii中使用RBAC是很简单的,完全不需要再写RBAC代码.所以准备工作就是,打开编辑器,跟我来.设置参数.建立数据库 在配置数组中,增加以下内 ...
- [Yii][RBAC]Yii中应用RBAC完全指南
开端筹办 Yii供给了强大的设备机制和很多现成的类库.在Yii中应用RBAC是很简单的,完全不须要再写RBAC代码.所以筹办工作就是,打开编辑器,跟我来. 设置参数.建树数据库 在设备数组中,增长以下 ...
- 在YII中使用Redis等缓存
Yii AR 单行数据-自动缓存机制 | LOCKPHP Yii AR 单行数据-自动LOG机制 CActiveRecordBehavior进阶 | LOCKPHP 缓存 - 权威指南 - Yii F ...
- yii 自带RBAC
common:中加 'authManager' => [ 'class' => 'yii\rbac\DbManager', 'itemTable' => 'auth_item', ' ...
- phpcms中的RBAC权限系统
PHPCMS中的RBAC权限系统主要用到了4张数据表:管理员表,角色表,菜单表,菜单权限表.先来看看数据库的数据表结构: admin 管理员表 ID 字段 类型 Null 默认 索引 额外 注释 1 ...
- Yii中的错误及异常处理
Yii中的错误及异常处理 Yii已经默认已经在CApplication上实现了异常和错误的接管,这是通过php的set_exception_handler, set_error_handler实现的. ...
- yii 中引入js 和css 的方式
在yii中 我们需要引入css 和 js 的时候,yii 自身有需要的类. 当我在views 视图层中引入css 和 js , <?php Yii::app()->clientScript ...
- 在yii中使用分页
yii中使用分页很方便,如下两种方法: 在控制器中: 1. $criteria = new CDbCriteria(); //new cdbcriteria数据库$criteria->id = ...
- 在yii中使用gearman
最近项目需要将利用gearman进行任务调度,目前所用框架为yii,在部署好gearman后,试图在yii中调用gearman,一直报错: 提示reverse函数没有定义,明明已经定义了啊!可能是当时 ...
随机推荐
- 扩增子统计绘图1箱线图:Alpha多样性
绘制Alpha多样性线箱图 绘图和统计全部为R语言,建议复制代码,在Rstuido中运行,并设置工作目录为存储之前分析结果文件的result目录 # 运行前,请在Rstudio中菜单栏选择“Sessi ...
- 判断点击第几个按钮JS代码的三种方法
方法一:使用下标实现<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...
- 26-Ubuntu-文件和目录命令-其他命令-管道
管道 Linux允许将一个命令的输出可以通过管道作为另一个命令的输入. 可以理解为现实生活中的管子,管子的一头塞东西进去,另一头取出来,这里的 | 左右分为两端,左端塞东西(写),右端取东西(读). ...
- 06C语言运算符
C语言运算符 算术运算符 运算符 描述 + 把两个操作数相加 - 从第一个操作数中减去第二个操作数 * 把两个操作数相乘 / 分子除以分母 % 取模运算符,整除后的余数 ++ 自增运算符,整数值增加 ...
- list查询棚舍面积的时候,所有棚舍面积的value都是一样的
解决办法 将pickingid在查list之前set到对象中,通过id来匹配查询 具体代码: FarmHouse farmHouse=new FarmHouse(); farmHouse.setPic ...
- for循环,isinstance() 函数
#isinstance()的运用 #练习: 求值总和以及平均值. str_list = [1,2,3,4,5,6,'a',7,8,9,'b',10,'c'] my_tal = 0 my_var = 0 ...
- BigDecimal运算
BigDecimal由任意精度整数未缩放值和32位整数级别组成 . 如果为零或正数,则刻度是小数点右侧的位数. 如果是负数,则数字的非标定值乘以10,以达到等级的否定的幂. 因此,BigDecimal ...
- Gym - 101670F Shooting Gallery(CTU Open Contest 2017 区间dp)
题目&题意:(有点难读...) 给出一个数字序列,找出一个区间,当删除这个区间中的两个相同的数字后,只保留这两个数字之间的序列,然后继续删除相同的数字,问最多可以实行多少次删除操作. 例如: ...
- java容器(数组和集合)内元素的排序问题
package com.janson.day20180827; import java.util.*; /** * java中容器内对象的排序可以通过Collections.sort()和Arrays ...
- Jmeter使用笔记之断言
前言 Jmeter的断言方式有很多种,由于在工作中经常做的是API接口测试,所以这篇文章主要介绍如何对接口的字段进行解析,如何对解析出来的字段的值断言 了解API接口 Restful API 规范 协 ...