Yii框架中集成分层的 RBAC,代码位于vendor\yiisoft\yii2\rbac中,rbac工作原理分为两部分,建立授权数据和进行权限检查。

  如上,一个角色拥有某个权限,如果希望用户拥有这个权限,那么就将拥有该权限的角色赋予给用户,特别是当系统中用户数量非常大的时候,如果需要修改权限只需要修改角色就可以了。

  角色和权限都可以按层次组织。特定情况下,一个角色可能由其他角色或权限构成, 而权限又由其他的权限构成。 一个角色可以包含一个权限,反之则不行。

  特定的权限,可以用一个规则 rule 与一个角色或者权限关联。一个规则用一段代码代表, 规则的执行是在检查一个用户是否满足这个角色或者权限时进行的。例如,"改帖" 的权限 可以使用一个检查该用户是否是帖子的创建者的规则。权限检查中,如果该用户 不是帖子创建者,那么他(她)将被认为不具有 "改帖"的权限。

  Yii中rbac的角色权限数据可以通过文件和数据库进行存放,如果是数据库存放角色权限数据,那么需要配置config目录下web.php和console.php中的authManager。下面以建立一个可以进行注册登录发帖的并且用户只可以修改自己文章的系统为例。

第一步:基本配置

              web.php

            console.php

第二步:初始化数据库

命令行中运行yii的migrate命令,需要将yii.bat所在目录添加到系统环境变量中就可以像下面这样执行了。

  

然后会在数据库中多出四个表,auth_item, auth_rule, auth_item_child, auth_assignment。

                auth_item表

存放权限数据,包含各个权限的名字和描述以及关联的规则,具体的字段含义可以参考yii\rbac\Item类:

<?php
namespace yii\rbac; use yii\base\Object; /**
* @author Qiang Xue <qiang.xue@gmail.com>
* @since 2.0
*/
class Item extends Object
{
const TYPE_ROLE = 1;
const TYPE_PERMISSION = 2; /**
* @var integer the type of the item. This should be either [[TYPE_ROLE]] or [[TYPE_PERMISSION]].
*/
public $type;
/**
* @var string the name of the item. This must be globally unique.
*/
public $name;
/**
* @var string the item description
*/
public $description;
/**
* @var string name of the rule associated with this item
*/
public $ruleName;
/**
* @var mixed the additional data associated with this item
*/
public $data;
/**
* @var integer UNIX timestamp representing the item creation time
*/
public $createdAt;
/**
* @var integer UNIX timestamp representing the item updating time
*/
public $updatedAt;
}

item中的type类型,表示该权限是包含一个权限集合的角色TYPE_ROLE ,还是单独权限TYPE_PERMISSION。auth_item_child就储存了角色和权限的父子关系数据。

  auth_rule表中定义了规则,auth_item_child储存了用户和角色的关系数据。

第三部:创建角色和权限

  这里创建基本的角色author和editArticle权限,以及一个规则,规定只有对自己的文章可以有editArticle权限。在@app目录下新建rbac文件夹:

<?php
namespace app\rbac; use yii\rbac\Rule; /**
* Created by PhpStorm.
* User: mao
* Date: 2016/10/28
* Time: 0:22
*/
class AuthorRule extends Rule
{
public $name = 'isAuthor'; public function execute($user, $item, $params)
{
return isset($params['post']) ? $params['post'] -> authorId == $user : false;
}
}

  该规则根据传入的$param数据判断,要修改的文章作者是否是自己。下面进行角色和权限的初始化,新建rbacController控制器,

<?php

namespace app\controllers;

use Yii;
use yii\web\Controller;
use app\rbac\AuthorRule; class RbacController extends Controller
{
public function actionInit()
{
$auth = Yii::$app -> authManager; $rule = new AuthorRule();
$auth -> add($rule); $updateArticle = $auth -> createPermission('updateArticle');
$updateArticle -> description = '更新自己文章';
$updateArticle -> ruleName = $rule -> name;
$auth -> add($updateArticle); $author = $auth -> createRole('author');
$auth -> add($author);
$auth -> addChild($author, $updateArticle);
}
}

  访问,http://localhost/?r=rbac/init,后数据库中会生产相应的权限角色数据。

其中,rule中data是被序列化后的对象。

反序列化后如下,

保存了rule的基本信息,权限创建好了,需要给每一个注册的用户赋予author权限,具体的注册和发表文章可以自己实现,下面贴一下注册时授予权限的代码:

    public function actionRegister()
{
$member = new Member(['scenario' => 'register']);
$post = Yii::$app -> request -> post();
if(isset($post['Member']))
{
$exist = Member::findIdentityByUsername($post['Member']['username']);
if(!$exist && $member -> load($post) && $member -> setPassword() && $member -> save())
{
$auth = Yii::$app -> authManager;
$author = $auth -> getRole('author');
$auth -> assign($author, $member -> id);
Yii::$app -> user -> login($member);
return $this -> goHome();
}
} return $this -> render("register", ['model' => $member]);
}

用户注册后通过getRole获得角色,然后赋予给用户。下面就是当用户修改文章的时候,根据角色和权限进行判断是否有权限修改。可以通过yii::$app -> user的can方法来进行验证。

    public function actionEdit()
{
$articleId = Yii::$app -> request -> get("id");
$article = Article::findOne(['id' => $articleId]);
if($article){
//鉴定是否拥有updateArticle权限
if(Yii::$app -> user -> can('updateArticle', ['post' => $article])){
return $this -> render('edit', ['article' => $article]);
}
return $this -> render('noAuth');
}else{
return $this -> redirect('/?r=article/articles');
}
}

其中,第二个参数就是以后会传给AuthorRule中的execute方法的最后一个参数,这里传入的是article的ActiveRecord对象。

当我们对别人的文章点击编辑后会跳转到你没有权限的提示页面,而自己的文章可以正常修改。

提示没有权限。

参考:

http://www.yiichina.com/doc/guide/2.0/security-authorization

http://en.wikipedia.org/wiki/Role-based_access_control

Yii rbac原理和实践的更多相关文章

  1. Atitit 管理原理与实践attilax总结

    Atitit 管理原理与实践attilax总结 1. 管理学分类1 2. 我要学的管理学科2 3. 管理学原理2 4. 管理心理学2 5. 现代管理理论与方法2 6. <领导科学与艺术4 7. ...

  2. Atitit.ide技术原理与实践attilax总结

    Atitit.ide技术原理与实践attilax总结 1.1. 语法着色1 1.2. 智能提示1 1.3. 类成员outline..func list1 1.4. 类型推导(type inferenc ...

  3. Atitit.异步编程技术原理与实践attilax总结

    Atitit.异步编程技术原理与实践attilax总结 1. 俩种实现模式 类库方式,以及语言方式,java futuretask ,c# await1 2. 事件(中断)机制1 3. Await 模 ...

  4. Atitit.软件兼容性原理与实践 v5 qa2.docx

    Atitit.软件兼容性原理与实践   v5 qa2.docx 1. Keyword2 2. 提升兼容性的原则2 2.1. What 与how 分离2 2.2. 老人老办法,新人新办法,只新增,少修改 ...

  5. Atitit 表达式原理 语法分析 原理与实践 解析java的dsl  递归下降是现阶段主流的语法分析方法

    Atitit 表达式原理 语法分析 原理与实践 解析java的dsl  递归下降是现阶段主流的语法分析方法 于是我们可以把上面的语法改写成如下形式:1 合并前缀1 语法分析有自上而下和自下而上两种分析 ...

  6. Atitit.gui api自动化调用技术原理与实践

    Atitit.gui api自动化调用技术原理与实践 gui接口实现分类(h5,win gui, paint opengl,,swing,,.net winform,)1 Solu cate1 Sol ...

  7. Atitit.提升语言可读性原理与实践

    Atitit.提升语言可读性原理与实践 表1-1  语言评价标准和影响它们的语言特性1 1.3.1.2  正交性2 1.3.2.2  对抽象的支持3 1.3.2.3  表达性3 .6  语言设计中的权 ...

  8. Atitit 网络爬虫与数据采集器的原理与实践attilax著 v2

    Atitit 网络爬虫与数据采集器的原理与实践attilax著 v2 1. 数据采集1 1.1. http lib1 1.2. HTML Parsers,1 1.3. 第8章 web爬取199 1 2 ...

  9. Atitit.软件兼容性原理与实践 v3 q326.docx

    Atitit.软件兼容性原理与实践 v3 q326.docx 1. 架构兼容性1 2. Api兼容性1 2.1. 新api  vs  修改旧的api1 3. Web方面的兼容性(js,html)1 3 ...

随机推荐

  1. WebStorm

    1,简介 WebStorm 10是一款强大的HTML5编辑工具,是 JetBrains 推出的一款商业的 JavaScript 开发工具.功能强大的前端专用IDE,拥有即时编辑(chrome).自动完 ...

  2. vs2015 编译时错误列表中没有错误,dll却没有生成出来

    最近发现vs2015的一个问题, 编译时,错误列表中没有错误,dll却没有生成出来,vs重启也无效 解决: 多次排查发现如果一个类库设置的是framework 4.0版本,但引用了framework4 ...

  3. JavaScript的two-sum问题解法

    一个很常见的问题,找出一个数组中和为给定值的两个数的下标.为了简单一般会注明解只有一个之类的. 最容易想到的方法是循环遍历,这里就不说了. 在JS中比较优雅的方式是利用JS的对象作为hash的方式: ...

  4. EF里一对一、一对多、多对多关系的配置和级联删除

    本章节开始了解EF的各种关系.如果你对EF里实体间的各种关系还不是很熟悉,可以看看我的思路,能帮你更快的理解. I.实体间一对一的关系 添加一个PersonPhoto类,表示用户照片类 /// < ...

  5. ASP.NET MVC Form验证

    一.前言 关于表单验证,园子里已经有不少的文章,相信Web开发人员也都基本写过,最近在一个个人项目中刚好用到,在这里与大家分享一下.本来想从用户注册开始写起,但发现东西比较多,涉及到界面.前端验证.前 ...

  6. 微信随机红包(Java)

    概述 最近受一朋友提醒,问微信红包怎么实现的,当时思考了一下,觉得好像很容易,可是当真正实现的时候,发现其中有不少问题,于是小白博主查阅资料,其中资料主要来源于知乎的一篇讨论<微信红包的随机算法 ...

  7. .NET跨平台之旅:探秘 dotnet run 如何运行 .NET Core 应用程序

    自从用 dotnet run 成功运行第一个 "Hello world" .NET Core 应用程序后,一直有个好奇心:dotnet run 究竟是如何运行一个 .NET Cor ...

  8. Mongodb的安装使用

    1.下载 最好不要去.com的那个网站下载:    各个版本的下载地址: http://dl.mongodb.org/dl/win32/x86_64 2.压缩包版本: 下载压缩包版本,目录结构如图: ...

  9. Dockerfile初探

    git上的asp.net samples工程已经写好了docker file,内容是如下   //任何dockersfile都要以FORM开头,约定是用大写. FROM microsoft/aspne ...

  10. MSSQL的表锁

    DECLARE @PlanId INT; BEGIN TRAN; INSERT INTO TbName(col,col2) VALUES ('sss','2016/11/8 18:25:12'); S ...