本人小菜鸟一仅仅,为了自我学习和交流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 。

最新文章

  1. (转)整体把握jQuery -jQuery 的原型关系图
  2. MVC4 下DropDownList使用方法
  3. poj 2398 (叉积+二分)
  4. Quick Tip: How to Add Syntax Highlighting to Any Project
  5. 开源的许可证GPL、LGPL、BSD、Apache 2.0的通俗解释
  6. python3 利用pip命令安装包和模块
  7. CMD 命令1
  8. Docker save & load
  9. maven 错误列表
  10. 传统路由和OVS区别
  11. Perl file checking --- How to get information about a file
  12. 雷林鹏分享:Ruby 范围(Range)
  13. 腾讯云服务器部署 django项目整个流程
  14. mask layer的遮罩层
  15. 怎么在vue中引入layui
  16. HDU 1248 寒冰王座 (完全背包)
  17. [CLR via C#]值类型的装箱和拆箱
  18. react核心知识点高度总结
  19. JDK、JRE、JVM各自是什么、以及什么关系
  20. EntityFramework 学习 一 Entity Framework结构体系

热门文章

  1. java设计模式之策略模式总结
  2. 使用libpqxx访问PostgreSQL数据库(mingw编译libpqxx)
  3. 自学php【一】 任务:图片上传即时可见
  4. jQuery.fn.extend和jQuery.extend
  5. HDU_3591_(多重背包+完全背包)
  6. cstring replace
  7. 并发和多线程(六)--ThreadLocal
  8. UVA - 10410 Tree Reconstruction(栈处理递归)
  9. CentOS \Linux 6版本系统命令及其使用详解
  10. zabbix3.4调用钉钉报警通知(超详细)