转载自 xmlife 的博客 : http://blog.csdn.net/xmlife/article/details/50733451

1.首先我们要在配置文件的组件(component)里面配置一下 Rbac

  1. ‘authManager’ => [
  2. ‘class’ => ‘yii\rbac\DbManager’,
  3. ‘itemTable’ => ‘auth_item’,
  4. ‘assignmentTable’ => ‘auth_assignment’,
  5. ‘itemChildTable’ => ‘auth_item_child’,
  6. ],

2.生成rbac默认数据表

a.运行下面的命令生成权限数据表:

yii migrate --migrationPath=@yii/rbac/migrations/
b.也可以打开vendor\yiisoft\yii2\rbac\migrations\schema-MySQL.sql 拷贝里面的内容到数据库运行生成数据表


3.添加角色和权限

a.创建权限

  1. public function createPermission($name)
  2. {
  3. $auth = Yii::$app->authManager;
  4. $createPost = $auth->createPermission($name);
  5. $createPost->description = ‘创建了 ‘ . $name. ‘ 权限’;
  6. $auth->add($createPost);
  7. }

b.创建角色

  1. public function createRole($name)
  2. {
  3. $auth = Yii::$app->authManager;
  4. $role = $auth->createRole($name);
  5. $role->description = ‘创建了 ‘ . $name. ‘ 角色’;
  6. $auth->add($role);
  7. }

以上两条添加,会创auth_item表中创建两条记录,以表中的type类型作为区分,type=1是角色,type=2为权限

  1. public function add($object)
  2. {
  3. if ($object instanceof Item) {
  4. return $this->addItem($object);
  5. } elseif ($object instanceof Rule) {
  6. return $this->addRule($object);
  7. } else {
  8. throw new InvalidParamException(“Adding unsupported object type.”);
  9. }
  10. }

add方法会根据你传入的对象属性进行添加(添加角色和权限都是addItem,因为createPermission和createRole都创建了一个Item对象,只是对象中的type值不同)


4.添加用户、角色和权限之间的关系

a.将权限赋给角色

  1. public function addChild($items)
  2. {
  3. $auth = Yii::$app->authManager;
  4. $parent = $auth->createRole($items[‘role’]);                //创建角色对象
  5. $child = $auth->createPermission($items[‘permission’]);     //创建权限对象
  6. $auth->addChild($parent, $child);                           //添加对应关系
  7. }

注意:上面创建的角色和权限对象,必须已经在数据库中创建,比如items[‘role’] = test,否则会报错

b.将角色赋给用户

  1. public function addChild($items)
  2. {
  3. $auth = Yii::$app->authManager;
  4. $role = $auth->createRole($items[‘role’]);                //创建角色对象
  5. $user_id = 1;                                             //获取用户id,此处假设用户id=1
  6. $auth->assign($role, $user_id);                           //添加对应关系
  7. }

5.验证权限

  1. public function beforeAction($action)
  2. {
  3. $action = Yii::$app->controller->action->id;
  4. if(\Yii::$app->user->can($action)){
  5. return true;
  6. }else{
  7. throw new \yii\web\UnauthorizedHttpException(‘对不起,您现在还没获此操作的权限’);
  8. }
  9. }

看下\Yii::$app->user->can()这个方法

  1. public function can($permissionName, $params = [], $allowCaching = true)
  2. {
  3. if ($allowCaching && empty($params) && isset($this->_access[$permissionName])) {
  4. return $this->_access[$permissionName];
  5. }
  6. $access = $this->getAuthManager()->checkAccess($this->getId(), $permissionName, $params);
  7. if ($allowCaching && empty($params)) {
  8. $this->_access[$permissionName] = $access;
  9. }
  10. return $access;
  11. }

=============================================================

2016-02-24 21:05 268人阅读 评论(0) 收藏 举报
分类:
Yii2(48) 

思路解说:

首先,我们约定以Controller/Action这样的格式作为有效的权限名称,直接将权限赋给用户,最后在can这个方法中做校验。为了不破坏源码,我们可以在ActiveRecord之前加一层基础控制器BaseController,普通控制器继承BaseController。

方案一

创建权限:

那么我们建立对应的权限数据(如何创建在RBAC第二篇中已经详细讲解)

权限post/detail:文章详情页的权限

权限赋给用户:

将权限直接赋给用户(此处用户ID为1)

检测权限:

在基础控制器中的beforeAction中验证权限:

  1. public function beforeAction($action)
  2. {
  3. if (!parent::beforeAction($action)) {
  4. return false;
  5. }
  6. $controller = Yii::$app->controller->id;
  7. $action = Yii::$app->controller->action->id;
  8. $permissionName = $controller.‘/’.$action;
  9. if(!\Yii::$app->user->can($permissionName) && Yii::$app->getErrorHandler()->exception === null){
  10. throw new \yii\web\UnauthorizedHttpException(‘对不起,您现在还没获此操作的权限’);
  11. }
  12. return true;
  13. }

注意:

  1. Yii::$app->getErrorHandler()->exception === null

这个必须要加,不然会报错,至于为什么就不多说了,简称一言难尽,V_V

方案二(代码就不赘述了跟上面差不多)

权限赋给角色,角色赋给用户

创建角色:

还是之前的权限[post/detail],去掉权限和用户关联,添加权限和角色的上下级关联

将角色赋给用户

检测权限

效果于上面保持一致

Yii 框架的Rbac [权限控制]的更多相关文章

  1. yii2 rbac权限控制之菜单menu详细教程

    作者:白狼 出处:http://www.manks.top/article/yii2_rbac_menu本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...

  2. yii2搭建完美后台并实现rbac权限控制实例教程

    1.安装yii2 未安装的请参考yii2史上最简单式安装教程,没有之一 或者参考yii2实战教程之详细安装步骤 已安装的请继续看下一步操作 2.配置数据库 2.1 配置数据库 修改common/con ...

  3. yii2 rbac权限控制详细操作步骤

    作者:白狼 出处:http://www.manks.top/article/yii2_rbac_description本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出 ...

  4. revel框架教程之权限控制

    Go语言实战 - revel框架教程之权限控制 一个站点上面最基本都会有三种用户角色,未登录用户.已登录用户和管理员.这一次我们就来看看在revel框架下如何进行权限控制. 因为revel是MVC结构 ...

  5. Kubernetes-16:一文详解ServiceAccount及RBAC权限控制

    一.ServiceAccount 1.ServiceAccount 介绍 首先Kubernetes中账户区分为:User Accounts(用户账户) 和 Service Accounts(服务账户) ...

  6. PHP RBAC权限控制,基于CI框架(版本3.1.9)

    2018年11月7日更新:目前功能已做到事件级别权限控制,如:后台用户的添加操作.删除操作和保存操作等具体到事件级的操作方法有权限则展示相应的操作菜单,没权限则隐藏相应菜单或提示无权限到目前算是真正做 ...

  7. yii2搭建完美后台并实现rbac权限控制案例教程

    作者:白狼 出处:www.manks.top/article/yii2_frame_rbac_template 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连 ...

  8. Yii2搭建后台并实现rbac权限控制完整实例教程

    .安装yii2 未安装的请参考yii2史上最简单式安装教程,没有之一 已安装的请继续看下一步操作 2.配置数据库 2.1 配置数据库 修改common/config/main-local.php 实际 ...

  9. YII框架实现 RBAC

    (1).在  common\config\main.php添加 'components' => [ ’authManager’ => [            ’class’ => ...

随机推荐

  1. [转]Custom Controls in Visual C# .NET-如何实现自定义控件

    A very simple introduction to writing your first .NET control Download source files - 1 Kb Introduct ...

  2. OpenCV 中轮廓包裹的几个函数boundingRect、minAreaRect、minEnclosingCircle用法

    当我们得到对象轮廓后,可用boundingRect()得到包覆此轮廓的最小正矩形,minAreaRect()得到包覆轮廓的最小斜矩形,minEnclosingCircle()得到包覆此轮廓的最小圆形, ...

  3. php5.6.40编译安装

    yum install gcc bison bison-devel zlib-devel libmcrypt-devel mcrypt mhash-devel openssl-devel libxml ...

  4. 测试计划&性能测试分析报告模板(仅供参考)

    一.测试计划 1. 引言 1.1  编写目的 2. 参考文档 3. 测试目的 4. 测试范围 4.1  测试对象 4.2  需要测试的特性 4.3  无需测试的特性 5. 测试启动与结束准则 5.1  ...

  5. CAN设计与应用指南

    CAN设计与应用指南 0.前言 这是我为公司写的一个关于CAN总线的入门文章,对全面理解CAN总线特性很有帮助,拿出来分享给大家. 1. 简介 CAN总线由德国BOSCH公司开发,最高速率可达到1Mb ...

  6. 20155239吕宇轩《网络对抗》Exp3 免杀原理与实践

    20155239吕宇轩<网络对抗>Exp3 免杀原理与实践 实验过程 Kali使用上次实验msfvenom产生后门的可执行文件,上传到老师提供的网址http://www.virscan.o ...

  7. Luogu T24242 购物券Ⅰ(数据已加强)

    这是一道比赛时的题目,但由于我没报名,所以浪费了一个大好的切水题的机会. 是经典的meet in middle(折半搜索)的模板题,但是之前一直没找到这种题目,今天终于看到了. 由于m的范围极大,因此 ...

  8. [清华集训2015 Day2]矩阵变换-[稳定婚姻模型]

    Description 给出一个N行M列的矩阵,保证满足以下性质: M>N. 矩阵中每个数都是 [0,N]中的自然数. 每行中, [1,N]中每个自然数刚好出现一次,其余的都是0. 每列中,[1 ...

  9. MiZ702学习笔记11——如何使用vivado isim仿真

    说到vivado的仿真确实是很有意思,不管是ISE还是Quartus都可以自己自动生成测试平台的完整构架,但是vivado不行,所有的测试代码自己写!(我反正是查了好久,都没发现vivado如何自动生 ...

  10. libgdx学习记录1——图片显示Texture

    libgdx底层采用opengl渲染,对图片进行了优化处理,与android原生态的bitmap不太一样. 相比而言,效率要高一些,不过只支持png,jpg,bmp三种格式. 显示中,一般将图片放在a ...