Yii 框架的Rbac [权限控制]
转载自 xmlife 的博客 : http://blog.csdn.net/xmlife/article/details/50733451
1.首先我们要在配置文件的组件(component)里面配置一下 Rbac
- ‘authManager’ => [
- ‘class’ => ‘yii\rbac\DbManager’,
- ‘itemTable’ => ‘auth_item’,
- ‘assignmentTable’ => ‘auth_assignment’,
- ‘itemChildTable’ => ‘auth_item_child’,
- ],
2.生成rbac默认数据表
a.运行下面的命令生成权限数据表:
yii migrate --migrationPath=@yii/rbac/migrations/
b.也可以打开vendor\yiisoft\yii2\rbac\migrations\schema-MySQL.sql 拷贝里面的内容到数据库运行生成数据表
3.添加角色和权限
a.创建权限
- public function createPermission($name)
- {
- $auth = Yii::$app->authManager;
- $createPost = $auth->createPermission($name);
- $createPost->description = ‘创建了 ‘ . $name. ‘ 权限’;
- $auth->add($createPost);
- }
b.创建角色
- public function createRole($name)
- {
- $auth = Yii::$app->authManager;
- $role = $auth->createRole($name);
- $role->description = ‘创建了 ‘ . $name. ‘ 角色’;
- $auth->add($role);
- }
以上两条添加,会创auth_item表中创建两条记录,以表中的type类型作为区分,type=1是角色,type=2为权限
- public function add($object)
- {
- if ($object instanceof Item) {
- return $this->addItem($object);
- } elseif ($object instanceof Rule) {
- return $this->addRule($object);
- } else {
- throw new InvalidParamException(“Adding unsupported object type.”);
- }
- }
add方法会根据你传入的对象属性进行添加(添加角色和权限都是addItem,因为createPermission和createRole都创建了一个Item对象,只是对象中的type值不同)
4.添加用户、角色和权限之间的关系
a.将权限赋给角色
- public function addChild($items)
- {
- $auth = Yii::$app->authManager;
- $parent = $auth->createRole($items[‘role’]); //创建角色对象
- $child = $auth->createPermission($items[‘permission’]); //创建权限对象
- $auth->addChild($parent, $child); //添加对应关系
- }
注意:上面创建的角色和权限对象,必须已经在数据库中创建,比如items[‘role’] = test,否则会报错
b.将角色赋给用户
- public function addChild($items)
- {
- $auth = Yii::$app->authManager;
- $role = $auth->createRole($items[‘role’]); //创建角色对象
- $user_id = 1; //获取用户id,此处假设用户id=1
- $auth->assign($role, $user_id); //添加对应关系
- }
5.验证权限
- public function beforeAction($action)
- {
- $action = Yii::$app->controller->action->id;
- if(\Yii::$app->user->can($action)){
- return true;
- }else{
- throw new \yii\web\UnauthorizedHttpException(‘对不起,您现在还没获此操作的权限’);
- }
- }
看下\Yii::$app->user->can()这个方法
- public function can($permissionName, $params = [], $allowCaching = true)
- {
- if ($allowCaching && empty($params) && isset($this->_access[$permissionName])) {
- return $this->_access[$permissionName];
- }
- $access = $this->getAuthManager()->checkAccess($this->getId(), $permissionName, $params);
- if ($allowCaching && empty($params)) {
- $this->_access[$permissionName] = $access;
- }
- return $access;
- }
=============================================================

思路解说:
首先,我们约定以Controller/Action这样的格式作为有效的权限名称,直接将权限赋给用户,最后在can这个方法中做校验。为了不破坏源码,我们可以在ActiveRecord之前加一层基础控制器BaseController,普通控制器继承BaseController。
方案一
创建权限:
那么我们建立对应的权限数据(如何创建在RBAC第二篇中已经详细讲解)
权限post/detail:文章详情页的权限
权限赋给用户:
将权限直接赋给用户(此处用户ID为1)
检测权限:
在基础控制器中的beforeAction中验证权限:
- public function beforeAction($action)
- {
- if (!parent::beforeAction($action)) {
- return false;
- }
- $controller = Yii::$app->controller->id;
- $action = Yii::$app->controller->action->id;
- $permissionName = $controller.‘/’.$action;
- if(!\Yii::$app->user->can($permissionName) && Yii::$app->getErrorHandler()->exception === null){
- throw new \yii\web\UnauthorizedHttpException(‘对不起,您现在还没获此操作的权限’);
- }
- return true;
- }
注意:
- Yii::$app->getErrorHandler()->exception === null
这个必须要加,不然会报错,至于为什么就不多说了,简称一言难尽,V_V
方案二(代码就不赘述了跟上面差不多)
权限赋给角色,角色赋给用户
创建角色:
还是之前的权限[post/detail],去掉权限和用户关联,添加权限和角色的上下级关联
将角色赋给用户
检测权限
效果于上面保持一致
Yii 框架的Rbac [权限控制]的更多相关文章
- yii2 rbac权限控制之菜单menu详细教程
作者:白狼 出处:http://www.manks.top/article/yii2_rbac_menu本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...
- yii2搭建完美后台并实现rbac权限控制实例教程
1.安装yii2 未安装的请参考yii2史上最简单式安装教程,没有之一 或者参考yii2实战教程之详细安装步骤 已安装的请继续看下一步操作 2.配置数据库 2.1 配置数据库 修改common/con ...
- yii2 rbac权限控制详细操作步骤
作者:白狼 出处:http://www.manks.top/article/yii2_rbac_description本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出 ...
- revel框架教程之权限控制
Go语言实战 - revel框架教程之权限控制 一个站点上面最基本都会有三种用户角色,未登录用户.已登录用户和管理员.这一次我们就来看看在revel框架下如何进行权限控制. 因为revel是MVC结构 ...
- Kubernetes-16:一文详解ServiceAccount及RBAC权限控制
一.ServiceAccount 1.ServiceAccount 介绍 首先Kubernetes中账户区分为:User Accounts(用户账户) 和 Service Accounts(服务账户) ...
- PHP RBAC权限控制,基于CI框架(版本3.1.9)
2018年11月7日更新:目前功能已做到事件级别权限控制,如:后台用户的添加操作.删除操作和保存操作等具体到事件级的操作方法有权限则展示相应的操作菜单,没权限则隐藏相应菜单或提示无权限到目前算是真正做 ...
- yii2搭建完美后台并实现rbac权限控制案例教程
作者:白狼 出处:www.manks.top/article/yii2_frame_rbac_template 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连 ...
- Yii2搭建后台并实现rbac权限控制完整实例教程
.安装yii2 未安装的请参考yii2史上最简单式安装教程,没有之一 已安装的请继续看下一步操作 2.配置数据库 2.1 配置数据库 修改common/config/main-local.php 实际 ...
- YII框架实现 RBAC
(1).在 common\config\main.php添加 'components' => [ ’authManager’ => [ ’class’ => ...
随机推荐
- day2-课堂笔记
#面向对象 函数=方法 系统内建函数:len().id() 对象函数
- Android 文件的读取和写入
(1)openFileInput和openFileOutput的使用 文件的使用,注意最后要用finally给关闭掉. openFileOutput:(写入文件,如果没有文件名可以创建,这里不需要判断 ...
- Android Fragment(三)ListFragment简单介绍以及Fragment之间通信
一.Fragment通信简单介绍:Fragments之间是不能够直接通信的,他们之间的通信是通过Activity这个中间件来通信的, 为了让Fragment跟它的Activity通信,我们可以在Fra ...
- neo4j用collect 代替union 并实行分页
MATCH pa=(j:User)-[r:PostLikeRel|:ReplyRel|:RetweetRel]->(m:User{guid:"f092a1dc6c23b26b020bd ...
- abp 将abp项目发布之后挂在IIS上无法访问嵌入资源的问题
在本地调试是能够正常访问到写在另一个程序集中的嵌入资源,但是发布之后 挂在IIS上却不能访问. 整了半天没找到原因.后来发现是发布时配置错误造成的:取消勾选precompile during publ ...
- 【第三方插件】使用Topshelf创建Windows服务
概述 Topshelf是创建Windows服务的另一种方法,老外的一篇文章Create a .NET Windows Service in 5 steps with Topshelf通过5个步骤详细的 ...
- 利用Python统计微信联系人男女比例以及简单的地区分布
寒暄的话不多说,直接进入主题. 运行效果图: [准备环境] Python版本:v3.5及其以上 开发工具:随意,此处使用Pycharm [依赖包] 1.itchat (CMD运行:pip instal ...
- elasticsearch同步mongodb--mongo connector的使用
部署准备 python-3.6.4-amd64.exe mongodb-win32-x86_64-3.4.6-signed.msi (如果已经安装可以忽略) 注意点! 之前我写的一篇文章用的是ela ...
- 一、Django前后端交互之Ajax和跨域问题
一.Ajax介绍 1.概述 AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术.AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Jav ...
- 【Android UI设计与开发】第04期:引导界面(四)仿人人网V5.9.2最新版引导界面
这一篇我将会以人人网的引导界面为实例来展开详细的讲解,人人网的引导界面比较的新颖,不同于其他应用程序千篇一律的靠滑动来引导用户,而是以一个一个比较生动形象的动画效果展示在用户们的面前,有一种给人眼前一 ...