[Yii][RBAC]Yii中应用RBAC完全指南
开端筹办
Yii供给了强大的设备机制和很多现成的类库。在Yii中应用RBAC是很简单的,完全不须要再写RBAC代码。所以筹办工作就是,打开编辑器,跟我来。
设置参数、建树数据库
在设备数组中,增长以下内容:
'components' => array(
//……
'authManager'=>array(
'class'=>'CDbAuthManager',//认证类名称
'defaultRoles'=>array('guest'),//默认角色
'itemTable' => 'pre_auth_item',//认证项表名称
'itemChildTable' => 'pre_auth_item_child',//认证项父子关系
'assignmentTable' => 'pre_auth_assignment',//认证项赋权关系
),
//……
那这三个数据表怎么建树呢?很简单,去看framework/web/auth/schema.sql。重视要和你的自定义的表名称对应起来。比如SQL文件中的AuthItem你要批改为pre_auth_item。然后在数据库中运行这个SQL文件中的语句。
懂得概念
你可能要问,剩下的代码呢?我告诉你,没有啦。RBAC体系就如许建树起来了。然则为了应用它,你须要懂得它的运行机制。我会尽量讲的烦琐一点……(官方的RBAC文档在这里,然则我曾经看了4-5遍才熟悉打听。)
三个概念
你须要懂得的是,授权项目可分为operations(步履),tasks(任务)和 roles(角色)。
一个用户拥有一个或者多个角色,比如,我们这里有三个角色:银行行长、银行人员、顾客。我们假设:
* 张行长 有角色:银行行长、银行人员、顾客(人家本身可以存钱嘛)。
* 王人员 有角色:银行人员、顾客。
* 小李 有角色:顾客。
那么,响应的,只要顾客可以做的工作,小李就可以做,王人员和张行长也可以。银行人员可以做的工作,王人员和张行长都可以做,小李就不成以了。
比如,一个“顾客”可以存钱,那么拥有“顾客”角色的张行长、王人员、小李都可以存钱。“银行人员”可以打印顾客的交易记录,那么有“银行人员” 角色的张行长和王人员都可以,而小李不可,必须找一个有“银行人员”角色的人才可以打印具体的交易记录。一个“银行行长”才可以进入银行钱库提钱,那么只 有张行长可以,因为它才有“银行行长”的角色。
这就是基于角色的认证体系,简称RBAC。
角色的持续
角色是可以持续的,比如我们规定如下:
* 凡是“银行行长”都是“银行人员”,也就是说,只要银行人员可以做的工作,银行行长都可以做。
* 凡是“银行人员”都是顾客,同上,顾客可以做的工作银行人员也可以做。
那么角色关系就变成了:
* 张行长 有角色:银行行长。
* 王人员 有角色:银行人员。
* 小李 有角色:顾客。
如许更简单了,这就是角色的持续。
任务的持续
一个任务(task)是可以包含别的一个任务的,我们举个例子,比如“进入银行”。
我们设定“顾客”这个角色有“进入银行”的权限。也就是说,“顾客”可以履行“进入银行”的任务。接下来,我们假设“进入柜台”是进入银行的父权 限,也就是说,“进入柜台”包含“进入银行”。只要能“进入柜台”的人都可以“进入银行”。我们把“进入柜台”这个任务权限给“银行人员”。
那么从角色上来说,王人员可以进入银行,因为王人员的角色是“银行人员”,而“银行人员”包含了“顾客”的角色。那么“顾客”可以进行的“任务”对于“银行人员”来说也是可以进行的。而“顾客”可以“进入银行”,那么王人员也可以“进入银行”。这是角色的持续带来的。
我们再假设有个赵辅导,是上级辅导,可以进入柜台进行观察。那么,我们的任务关系是:
* 赵辅导 有任务:进入柜台。
那么,赵辅导就可以“进入银行”。因为“进入银行”是被“进入柜台”包含的任务。只要可以履行“进入柜台”的人都可以履行“进入银行”。这就是任务的持续。
关于步履
步履是不成划分的一级。也就是说。而一个步履是不克不及包含其他步履的。假设我们有个步履叫“从银行仓库中提钱”。我们把这个步履作包含“进入柜台”。那么只要可以履行“从银行仓库中提钱”的角色都可以履行“进入柜台”这个任务。
三者关系
* 一个角色可以包含别的一个或者几个角色。
* 一个角色可以包含别的一个或者几个任务。
* 一个角色可以包含别的一个或者几个步履。
*
* 一个任务可以包含别的一个或者几个任务。
* 一个任务可以包含别的一个或者几个步履。
*
* 一个步履只能被角色或者任务包含,步履是不成以包含其他,也不成再分。
如许,就形成了一个权限经管体系。关于“任务”和“步履”,你不必思虑其字面上的意义。这两者就是形成两层权限。
进行赋权
我们建树了RBAC权限经管,就须要进行对权限的WEB经管。这些就须要你本身写代码了。
按照不合种类的项目调用下列办法之必然义授权项目:
* CAuthManager::createRole
* CAuthManager::createTask
* CAuthManager::createOperation
一旦我们拥有一套授权项目,我们可以调用以下办法建树授权项目关系:
* CAuthManager::addItemChild
* CAuthManager::removeItemChild
* CAuthItem::addChild
* CAuthItem::removeChild
最后,我们调用下列办法来分派角色项目给各个用户:
* CAuthManager::assign
* CAuthManager::revoke
下面我们将显现一个例子是关于用所供给的API建树一个授权等级:
$auth=Yii::app()->authManager;
$auth->createOperation("createPost","create a post");
$auth->createOperation("readPost","read a post");
$auth->createOperation("Post"," a post");
$auth->createOperation("Post"," a post");
$bizRule="return Yii::app()->user->id==$params["post"]->authID;";
$task=$auth->createTask("OwnPost"," a post by author himself",$bizRule);
$task->addChild("Post");
$role=$auth->createRole("reader");
$role->addChild("readPost");
$role=$auth->createRole("author");
$role->addChild("reader");
$role->addChild("createPost");
$role->addChild("OwnPost");
$role=$auth->createRole("editor");
$role->addChild("reader");
$role->addChild("Post");
$role=$auth->createRole("admin");
$role->addChild("editor");
$role->addChild("author");
$role->addChild("Post");
$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 !
From; http;//my.oschina.net/o0Kira0o/blog/95036
[Yii][RBAC]Yii中应用RBAC完全指南的更多相关文章
- Yii中使用RBAC完全指南
开始准备 Yii提供了强大的配置机制和很多现成的类库.在Yii中使用RBAC是很简单的,完全不需要再写RBAC代码.所以准备工作就是,打开编辑器,跟我来.设置参数.建立数据库 在配置数组中,增加以下内 ...
- Yii中使用RBAC全然指南
本人小菜鸟一仅仅,为了自我学习和交流PHP(jquery,linux,lamp,shell,javascript,server)等一系列的知识,小菜鸟创建了一个群. 希望光临本博客的人能够进来交流. ...
- YII2中使用RBAC对模块,控制器,方法的权限控制以及规则的使用
在使用YII2中自带的RBAC时,需要先配置config/web.php: return [ // ... 'components' => [ 'authManager' => [ 'cl ...
- phpcms中的RBAC权限系统
PHPCMS中的RBAC权限系统主要用到了4张数据表:管理员表,角色表,菜单表,菜单权限表.先来看看数据库的数据表结构: admin 管理员表 ID 字段 类型 Null 默认 索引 额外 注释 1 ...
- 前后端分离Web项目中,RBAC实现的研究
在前后端分离Web项目中,RBAC实现的研究 最近手头公司的网站项目终于渐渐走出混沌,走上正轨,任务也轻松了一些,终于有时间整理和总结一下之前做的东西. 以往的项目一般使用模板引擎(如ejs)渲染 ...
- ThinkPHP中:RBAC权限控制的实习步骤
使用版本ThinkPHP3.1.3 第一步,建表及数据 第二步,建关联模型 第三步,控制器使用关联模型.配置文件 第四步,模板显示数据 第一步,建表及数据 在数据库中,建立一个companysvn数据 ...
- Kubernetes中的RBAC
Kubernetes中,授权有ABAC(基于属性的访问控制).RBAC(基于角色的访问控制).Webhook.Node.AlwaysDeny(一直拒绝)和AlwaysAllow(一直允许)这6种模式. ...
- Yii 2.0 中事件的使用
关于PHP的事件处理,参照 http://www.cnblogs.com/mafeifan/p/4322238.html http://www.cnblogs.com/mafeifan/p/43222 ...
- yii框架的中的一些使用介绍
Yii框架的使用整理 获取配置文件中的数据 Yii::$app->params[‘配置文件中对应的参数名称’] 获取文件表单提交的数据 Yii::$app->request->pos ...
随机推荐
- zTree的getChangeCheckedNodes()使用
zTree的getChangeCheckedNodes()方法用于获取输入框勾选状态被改变的节点集合.如果需要获取每次操作后全部被改变勾选状态的节点数据,请在每次勾选操作后,遍历所有被改变勾选状态的节 ...
- obj-c 坑
BOOL,使用8位存储空间,具有YES和NO值,如果赋值微长于8位的变量,那么只有低位字节会用作BOOL值,例如8960=0x2300,低8位为0,BOOL为NO.
- 坑爹的NSIS转义符:$ (在NSIS的MessageBox中写换行文字)
最近的项目中,发现了NSIS一个比较坑的地方:$ 不但是变量常量的开头,还是一个转义字符. 大家有没有发现,NSIS写的脚本中,如果要让弹出消息框中的文字带换行功能,“\r\n” 是不是很不管用呢? ...
- 十分钟了解MVVMLight
十分钟了解MVVMLight 前言: 最近看了看开源框架MVVMLight,一直想写一点笔记,但是文笔欠佳,索性就放弃了.那就来翻译一点文章吧. 由于英文水平和技术水平有限,凡是不妥之处,请大家指 ...
- zzuli oj 1178 单词数
Description 统计一篇文章里不同单词的总数. Input 有多组数据,每组一行,每组就是一篇小文章.每篇小文章都是由小写字母和空格组成,没有标点符号,遇到#时表示输入结束. Output 每 ...
- NET笔记——IOC详解和Unity基础使用介绍
说起IOC,可能很多初学者不知道是用来做什么的,今天正好有点时间,就来扫扫盲,顺便巩固下自己. IOC全称是Inversion Of Control,意为控制反转(这些自然百度也有),可什么是控制反转 ...
- APNs推送, 处理通知
设备接到apns发来的通知,应用处理通知有以下几种情况: 1. 应用还没有加载 这时如果点击通知的显示按钮,会调用didFinishLaunchingWithOptions,不会调用didReceiv ...
- PHP获得文件的md5并检验是否被修改
由于需要判断上传的文件是否被修改过,需要记录上传文件的md5值,所以这里说一下一下获取文件md5值的方法. md5_file() md5_file() 函数计算文件的 MD5 散列.md5() 函 ...
- ie8下jquery读取当前点击的标签位置错误,原因是里面有内容写了text-indent:-9999px
今天写一地图的效果,鼠标点击对应的区域,弹出所点击区域的名字. 因为设计的区域名字有特殊效果,所以,在点击区域里面套了个标签写上区域名字用来识别,但是这个文字呢不同显示在页面上,所以就给 em 加个了 ...
- Word续上表
选中表格的下半部分(全部下半部分),然后按ctrl+shift+enter,这样就换行了.