开端筹办

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完全指南的更多相关文章

  1. Yii中使用RBAC完全指南

    开始准备 Yii提供了强大的配置机制和很多现成的类库.在Yii中使用RBAC是很简单的,完全不需要再写RBAC代码.所以准备工作就是,打开编辑器,跟我来.设置参数.建立数据库 在配置数组中,增加以下内 ...

  2. Yii中使用RBAC全然指南

    本人小菜鸟一仅仅,为了自我学习和交流PHP(jquery,linux,lamp,shell,javascript,server)等一系列的知识,小菜鸟创建了一个群. 希望光临本博客的人能够进来交流. ...

  3. YII2中使用RBAC对模块,控制器,方法的权限控制以及规则的使用

    在使用YII2中自带的RBAC时,需要先配置config/web.php: return [ // ... 'components' => [ 'authManager' => [ 'cl ...

  4. phpcms中的RBAC权限系统

    PHPCMS中的RBAC权限系统主要用到了4张数据表:管理员表,角色表,菜单表,菜单权限表.先来看看数据库的数据表结构: admin 管理员表 ID 字段 类型 Null 默认 索引 额外 注释 1 ...

  5. 前后端分离Web项目中,RBAC实现的研究

    在前后端分离Web项目中,RBAC实现的研究   最近手头公司的网站项目终于渐渐走出混沌,走上正轨,任务也轻松了一些,终于有时间整理和总结一下之前做的东西. 以往的项目一般使用模板引擎(如ejs)渲染 ...

  6. ThinkPHP中:RBAC权限控制的实习步骤

    使用版本ThinkPHP3.1.3 第一步,建表及数据 第二步,建关联模型 第三步,控制器使用关联模型.配置文件 第四步,模板显示数据 第一步,建表及数据 在数据库中,建立一个companysvn数据 ...

  7. Kubernetes中的RBAC

    Kubernetes中,授权有ABAC(基于属性的访问控制).RBAC(基于角色的访问控制).Webhook.Node.AlwaysDeny(一直拒绝)和AlwaysAllow(一直允许)这6种模式. ...

  8. Yii 2.0 中事件的使用

    关于PHP的事件处理,参照 http://www.cnblogs.com/mafeifan/p/4322238.html http://www.cnblogs.com/mafeifan/p/43222 ...

  9. yii框架的中的一些使用介绍

    Yii框架的使用整理 获取配置文件中的数据 Yii::$app->params[‘配置文件中对应的参数名称’] 获取文件表单提交的数据 Yii::$app->request->pos ...

随机推荐

  1. Lambda Expression In Java

     题记在阅读JDK源码java.util.Collections的时候在UnmodifiableCollection类中看到了这么一段代码: public void forEach(Consumer& ...

  2. BufferedReader、FileReader、FileInputStream的区别

    一.BufferReader BufferedReader   由Reader类扩展而来,提供通用的缓冲方式文本读取,而且提供了很实用的readLine,读取分行文本很适合,BufferedReade ...

  3. 对BFC的理解

    转载http://www.cnblogs.com/lhb25/p/inside-block-formatting-ontext.html 在解释 BFC 是什么之前,需要先介绍 Box.Formatt ...

  4. 快速设置IP的脚本

    @echo off cls ::set NAME="本地连接" set NAME="无线网络连接" set IP=192.168.1.55 set MASK=2 ...

  5. Remark of BLENDFUNCTION from MSDN

    Remarks When the AlphaFormat member is AC_SRC_ALPHA, the source bitmap must be 32 bpp. If it is not, ...

  6. What is machine learning?

    What is machine learning? One area of technology that is helping improve the services that we use on ...

  7. uva 1449 - Dominating Patterns

    简单的AC自动机: #include<cstdio> #include<cstring> #include<queue> #define maxn 150005 u ...

  8. Http 与 Socket 区别

    HTTP:超文本传输协议,首先它是一个协议,并且是基于TCP/IP协议基础之上的应用层协议.TCP/IP协议是传输层协议,主要解决数据如何在网络中传输,HTTP是应用层协议,主要解决如何包装数据.HT ...

  9. nojs iis asp.net mvc

    http://blogs.msdn.com/b/scott_hanselman/archive/2011/11/29/window-iis-node-js.aspx http://www.hansel ...

  10. client denied by server configuration

    http://blog.csdn.net/fdipzone/article/details/40512229