YII2中使用RBAC对模块,控制器,方法的权限控制以及规则的使用
在使用YII2中自带的RBAC时,需要先配置config/web.php:
return [
// ...
'components' => [
'authManager' => [
'class' => 'yii\rbac\DbManager',
],
// ...
],
];
如果你需要运行yii migrate来创建表,那么config/console.php也需要同上面一样配置一下。
cmd进入项目目录,运行如下命令:
yii migrate --migrationPath=@yii/rbac/migrations
你会发现在数据库中创建了四张表
auth_assignment 角色与用户的关联表
auth_item 存放角色与权限,通过type字段区分
auth_item_child 存放角色与权限的上下级关系
auth_rule 规则表,用于扩展权限功能
为了演示,我们在控制器下分别写四个方法,分别用来创建权限,创建角色,指派角色,使用规则。
IndexController.php代码如下:
<?php namespace app\controllers; use YII;
use app\models\MyUserLogin;
use app\rbac\UserUpdSelfRule;
use app\controllers\BaseController; class IndexController extends BaseController
{ //首页
public function actionIndex()
{
$this->renderPartial('index');
} //登陆
public function actionLogin()
{
if (YII::$app->request->isPost) {
$user = new MyUserLogin();
$user->load(YII::$app->request->post(), ''); if ($user->login()) {
echo '登陆成功';
} else {
echo '登陆失败';
} } else {
return $this->renderPartial('login');
}
} //为了演示,这里我们添加几条权限
public function actionPer()
{
$auth = YII::$app->authManager;
//创建用户删除权限
$per = $auth->createPermission('user/del');
$per->description = '删除用户';
$auth->add($per);
//创建用户更新权限
$per = $auth->createPermission('user/upd');
$per->description = '更新用户';
$auth->add($per);
//创建用户添加权限
$per = $auth->createPermission('user/add');
$per->description = '添加用户';
$auth->add($per);
//创建用户查看权限
$per = $auth->createPermission('user/list');
$per->description = '查看用户列表';
$auth->add($per);
} //添加角色
public function actionRole()
{
$auth = YII::$app->authManager; //添加管理员角色
$admin = $auth->createRole('admin');
$admin->description = '管理员';
$auth->add($admin);
//给管理员赋予权限
$auth->addChild($admin, $auth->getPermission('user/del'));
$auth->addChild($admin, $auth->getPermission('user/upd'));
$auth->addChild($admin, $auth->getPermission('user/add'));
$auth->addChild($admin, $auth->getPermission('user/list')); //添加普通员工角色
$employee = $auth->createRole('employee');
$employee->description = '普通员工';
$auth->add($employee);
$auth->addChild($employee, $auth->getPermission('user/list'));
$auth->addChild($employee, $auth->getPermission('user/add'));
} //给用户指派角色
public function actionAssign()
{
$auth = YII::$app->authManager; //注意这里的2是用户的ID,即你用户表user里的ID
//也可通过YII::$app->user->id获取
$auth->assign($auth->getRole('admin'), 1); $auth->assign($auth->getRole('employee'), 2);
} //添加规则
public function actionRule()
{
$auth = YII::$app->authManager;
$rule = new UserUpdSelfRule();
$auth->add($rule); //创建权限,与规则关联
$per = $auth->createPermission('user/upd/updSelf');
$per->description = '用户只能修改自已';
$per->ruleName = $rule->name;
$auth->add($per); //这里,要注意,要把user/upd/updSelf权限设为user/upd的父级
//要不然,普通员工访问user/upd这个方法会被拦住
$auth->addChild($per, $auth->getPermission('user/upd'));
//给普通员工赋予user/upd/updSelf权限,注意我们这里并没有给员工赋予user/upd权限
$auth->addChild($auth->getRole('employee'), $per);
}
}
我们在项目目录下创建rbac目录,并创建UserUpdSelfRule.php,来实现用户只能修改自已信息的规则。
<?php //注意命名空间要跟你的目录对应
namespace app\rbac; use yii\rbac\Rule; //必须继承自yii\rbac\Rule
class UserUpdSelfRule extends Rule
{
public $name = 'userUpdSelf'; //必须要实现execute方法
//$user表示用户ID
//$item规则相关的角色或者权限
//$params传递过来的参数
public function execute($user, $item, $params)
{
//如果没有设置参数ID,直接返回true
if (!isset($params['id'])) {
return true;
}
//判断id是否是当前用户ID
return ($params['id'] == $user) ? true : false;
}
}
我们访问index/per查看数据表中的变化。

访问index/role结果如下:

访问index/assign结果如下:

访问index/rule结果如下:

为了能够对我们的模块,控制器,方法进行权限控制,我们需要创建一个基类来统一处理,上面的控制器就是继承自基类。
BaseController.php代码如下:
<?php namespace app\controllers; use YII;
use yii\web\Controller; class BaseController extends Controller
{
//不需要验证的
protected $noCheckAccess = [
'index/index',
'index/per',
'index/role',
'index/assign',
'index/rule',
'index/login',
]; //不需要登陆的
protected $noLogin = [
'index/login',
]; //验证权限
//注意,不要把获取模块名,控制器名,方法名写到init()函数里,那样是获取不到的
//这个坑我已经踩了,大家就不用再去踩了
public function beforeAction($action)
{
$mid = !empty($this->module->id) ? $this->module->id : '';
$cid = !empty($this->id) ? $this->id : '';
$aid = !empty($action->id) ? $action->id : ''; //如果模块为basic,我们只验证控制器/方法
if ($mid == 'basic') {
$per = "{$cid}/{$aid}";
} else {
$per = "{$mid}/{$cid}/{$aid}";
} if (!in_array($per, $this->noLogin)) {
if (!$this->checkOnline()) {
$this->redirect('index/login');
}
} if (!in_array($per, $this->noCheckAccess)) {
if (!YII::$app->user->can($per)) {
die('你没有权限');
}
} return parent::beforeAction($action);
} //检查是否在线
public function checkOnline()
{
return !empty(YII::$app->user->id) ? true : false;
}
}
为了演示,我们创建一个UserController.php,代码如下:
<?php namespace app\controllers; use YII;
use app\controllers\BaseController; class UserController extends BaseController
{
public function actionUpd()
{
$id = YII::$app->request->get('id', 0); echo 'user id : ', YII::$app->user->id, '<br>'; //先判断用户有没有只能修改自已的权限
if (YII::$app->user->can('user/upd/updSelf')) {
//然后再判断修改ID是否与自已的ID一样,在UserUpdSelfRule里进行判断
if (YII::$app->user->can('user/upd/updSelf', ['id' => $id])) {
echo '有权修改自已';
} else {
echo '不能修改除自已以外的';
}
} else {
echo '修改所有';
}
} public function actionDel()
{
echo 'user id : ', YII::$app->user->id, '<br>';
echo 'user del';
} public function actionList()
{
echo 'user id : ', YII::$app->user->id, '<br>';
echo 'user list';
} public function actionAdd()
{
echo 'user id : ', YII::$app->user->id, '<br>';
echo 'user add';
}
}
我的用户表里有两个用户

分别登陆这两个用户,然后让他们访问user/add,user/del,user/list,user/upd,结果如下:
admin用户状态如下:

test用户状态如下:

test之所以能够访问user/upd是因为我们把user/upd/updSelf设为了user/upd的父级,如果没有设置,这里是会被拦住的。
YII2中使用RBAC对模块,控制器,方法的权限控制以及规则的使用的更多相关文章
- Python中os和shutil模块实用方法集…
Python中os和shutil模块实用方法集锦 类型:转载 时间:2014-05-13 这篇文章主要介绍了Python中os和shutil模块实用方法集锦,需要的朋友可以参考下 复制代码代码如下: ...
- Python中os和shutil模块实用方法集锦
Python中os和shutil模块实用方法集锦 类型:转载 时间:2014-05-13 这篇文章主要介绍了Python中os和shutil模块实用方法集锦,需要的朋友可以参考下 复制代码代码如下: ...
- Python中xlrd和xlwt模块使用方法 (python对excel文件的操作)
本文主要介绍可操作excel文件的xlrd.xlwt模块.其中xlrd模块实现对excel文件内容读取,xlwt模块实现对excel文件的写入. 安装xlrd和xlwt模块 xlrd和xlwt模块不是 ...
- 在struts2.3.4.1中使用注解、反射、拦截器实现基于方法的权限控制
权限控制是每一个系统都应该有的一个功能,有些只需要简单控制一下就可以了,然而有些却需要进行更加深入和细致的权限控制,尤其是对于一些MIS类系统,基于方法的权限控制就更加重要了. 用反射和自定义注解来实 ...
- JAVAEE——BOS物流项目11:在realm中授权、shiro的方法注解权限控制、shiro的标签权限控制、总结shiro的权限控制方式、权限管理
1 学习计划 1.在realm中进行授权 2.使用shiro的方法注解方式权限控制 n 在spring文件中配置开启shiro注解支持 n 在Action方法上使用注解 3.★使用shiro的标签进行 ...
- Spring Security(17)——基于方法的权限控制
目录 1.1 intercept-methods定义方法权限控制 1.2 使用pointcut定义方法权限控制 1.3 使用注解定义方法权限控制 1.3.1 JSR-25 ...
- 后端基于方法的权限控制--Spirng-Security
后端基于方法的权限控制--Spirng-Security 默认情况下, Spring Security 并不启用方法级的安全管控. 启用方法级的管控后, 可以针对不同的方法通过注解设置不同的访问条件: ...
- Spring Security教程之基于方法的权限控制(十二)
目录 1.1 intercept-methods定义方法权限控制 1.2 使用pointcut定义方法权限控制 1.3 使用注解定义方法权限控制 1.3.1 JSR-25 ...
- c/c++再学习:C++中public、protect、private的访问权限控制
C++中public.protect.private的访问权限控制 访问权限 一个类的public成员变量.成员函数,可以通过类的成员函数.类的实例变量进行访问 一个类的protected成员变量.成 ...
随机推荐
- php压力测试工具简单实用方法
命令 ab -h 指令帮助 ab -n100 -c10 http://www.baidu.com 发起100个请求 并发数为10 设置测试地址是百度,注意测试测试时候请求数和并发数尽量设置低一点 Re ...
- ReactiveX 学习笔记(12)调度器
Schedulers, threading and testing 本文的主题为调度器,多线程以及测试. RxJava操作符(六)Utility SubscribeOn / ObserveOn Sub ...
- 使用Node.JS监听文件夹变化
使用Node.JS监听文件夹改变有许多应用场合,比如: 构建自动编绎工具 当源文件改变时,自动运行build过程,比如当你写CoffeeScript文件或SASS CSS文件时,保存之后可即时生成对应 ...
- 自行编译mwan加入openwrt里
参考源文:http://www.right.com.cn/forum/thread-124449-1-1.html 本例以 opoenwrt 12.09正式版为例,原软件来自openwrt 英文论坛: ...
- python pip 下载慢 配置使用国内源配置
ubuntu apt 使用国内源 设置>软件和更新>下载自 选择mirrors.aliyun.com/ubuntu 更新源sudo apt-get update 安装系统包:sudo ap ...
- C++ AfxBeginThread的介绍/基本用法
AfxBeginThread 用户界面线程和工作者线程都是由AfxBeginThread创建的.现在,考察该函数:MFC提供了两个重载版的AfxBeginThread,一个用于用户界面线程,另一 ...
- java程序员到底该不该了解一点算法(一个简单的递归计算斐波那契数列的案例说明算法对程序的重要性)
为什么说 “算法是程序的灵魂这句话一点也不为过”,递归计算斐波那契数列的第50项是多少? 方案一:只是单纯的使用递归,递归的那个方法被执行了250多亿次,耗时1分钟还要多. 方案二:用一个map去存储 ...
- spring boot集成MyBatis
- webpack 学习
·1.https://www.2cto.com/kf/201711/696035.html 2. http://blog.csdn.net/x550392236/article/details/784 ...
- 04_web基础(九)考核与评估