转载自 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. 2018-2019-2 20165302 《网络对抗技术》Exp3 免杀原理与实践

    一,实验要求 (我是真的不知道为什么截图中都有学号和姓名信息了还要求改主机名......而且实验要求里也没有明确说.做完之后听别人说的,肯定是不能重新截图了,要扣分就扣吧) 通过本部分内容的学习,认识 ...

  2. VC++ MFC单文档应用程序SDI下调用glGenBuffersARB(1, &pbo)方法编译通过但执行时出错原因分析及解决办法:glewInit()初始化的错误

    1.问题症状 在VC++环境下,利用MFC单文档应用程序SDI下开发OpenGL程序,当调用glGenBuffersARB(1, &pbo)方法编译通过但执行时出错,出错代码如下: OpenG ...

  3. openJDK环境搭建编译(fedora)

    1.安装VMware  VMware-workstation-full-10.0.7-2844087.exe    破解码:HY06L-F334P-9Z6H9-6R2XM-23C6J  安装完成之后, ...

  4. C++之强制类型转化

    在C++语言中新增了四个关键字static_cast.const_cast.reinterpret_cast和dynamic_cast.这四个关键字都是用于强制类型转换的.我们逐一来介绍这四个关键字. ...

  5. tarjan - 强连通

    如果两个点可以互相到达,则称为强连通.如果有向图G每个点都可以互相到达,则称为强连通图.其中G中的极大强连通子图,则称为强连通分量.现求强连通分量是多少,且哪些点属于同一个强连通分量 tarjan由d ...

  6. A. Pride

    You have an array a with length n, you can perform operations. Each operation is like this: choose t ...

  7. python获取文件扩展名的方法(转)

    主要介绍了python获取文件扩展名的方法,涉及Python针对文件路径的相关操作技巧.具体实现方法如下: 1 2 3 4 import os.path def file_extension(path ...

  8. 在ado.net中实现oracle存储过程调用两种方式

      1.常规的存储过程调用 String or=ConfigurationManager.ConnectionStrings["conn"].ToString(); OracleC ...

  9. 带你看懂大数据采集引擎之Flume&采集目录中的日志

    一.Flume的介绍: Flume由Cloudera公司开发,是一种提供高可用.高可靠.分布式海量日志采集.聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于采集数据:同时,flum ...

  10. HDFS--大数据应用的基石

    近些年,由于智能手机的迅速普及推动移动互联网技术的蓬勃发展,全球数据呈现爆发式的增长.2018年5月企鹅号的统计结果:互联网每天新增的数据量达2.5*10^18字节,而全球90%的数据都是在过去的两年 ...