Yii2 rbac权限控制之rule教程详解


Posted in PHP onJune 23, 2016

在我们之前Yii2搭建后台并实现rbac权限控制完整实例教程中,不知道你曾经疑惑过没有一个问题,rule表是做什么的,为什么在整个过程中我们都没有涉及到这张表?

相信我不说,部分人也都会去尝试,或百度或google,到头来也会竹篮打水,这部分讲解的内容少之又少啊!

对于一般的权限系统而言,我们之前做的rbac一般情况下是足够的,即时没有rule,相信你也能实现我们用rule实现的功能。

我们就以官网的例子给出一个具体的操作教程,看看这个神秘的rule到底是做什么的!

看需求:

我们有管理员和普通用户,对于文章系统而言,我们允许管理员对文章的任何操作,但是只允许普通用户创建文章和修改自己创建的文章,注意哦,是允许其修改自己创建的文章,不是不允许修改文章,也不是修改所有的文章!

看yii2 rbac rule怎么去实现,重点是教大家怎么去使用这个rule,也解开众多人心中的节!

在我们添加rule之前,需要先实现 yii\rbac\Rule类的execute方法。

<?php
namespace backend\components;
use Yii;
use yii\rbac\Rule;
class ArticleRule extends Rule
{
public $name = 'article';
public function execute($user, $item, $params)
{
// 这里先设置为false,逻辑上后面再完善
return false;
}
}

接着,我们才可以去后台rule列表(/admin/rule/index)添加rule。具体添加方式可参考下方截图

Yii2 rbac权限控制之rule教程详解

注意,上面这一步很多人会死在类名的添加上,记得加上我们ArticleRule文件所在的命名空间!

我们看第三步,该步骤也是很容易出错的地方!该篇教程请注意集中精力,前方高能!

我们访问权限列表(/admin/permission/index)新增权限,该权限只针对文章的修改,随后我们将其分配给用户所属角色

需要注意了,此处严重警告,这里新增加的权限所控制的路由也就是文章的更新操作(/article/update)分配给当前用户仅且一次,重复分配当前操作给所属角色或用户,可能造成rule失效,失效原因则是覆盖!

此刻再次刷新文章的更新页面(/article/update/1),很显然直接给我们了403 forbidden没权限访问的提示,也就是我们刚刚添加的rule生效了!如果此刻没生效,请检查上面所说的两个注意点!

然后我们实现ArticleRule::execute方法内业务逻辑,可参考如下:

class ArticleRule extends Rule
{
public $name = 'article';
/**
* @param string|integer $user 当前登录用户的uid
* @param Item $item 所属规则rule,也就是我们后面要进行的新增规则
* @param array $params 当前请求携带的参数. 
* @return true或false.true用户可访问 false用户不可访问
*/
public function execute($user, $item, $params)
{
$id = isset($params['id']) ? $params['id'] : null;
if (!$id) {
return false;
}
$model = Article::findOne($id);
if (!$model) {
return false;
}
$username = Yii::$app->user->identity->username;
$role = Yii::$app->user->identity->role;
if ($role == User::ROLE_ADMIN || $username == $model->operate) {
return true;
}
return false;
}
}

最后就是验证了,到底我们所实现的rule认证起作用了没呢?

测试步骤如下可做参考:

1.当前用户创建一篇文章,记得记录当前文章的创建者,其角色是管理员,我们默认User::ROLE_ADMIN

2.创建一个普通用户,且也创建一篇文章,同时也需要记录当前文章的创建者

3.分别用管理员帐号和普通用户登录系统修改这两篇文章,结论自然是满足我们一开始所提的需求,管理员两篇文章均可修改,普通用户只能修改自己的文章

以上所述是小编给大家介绍的Yii2 rbac权限控制之rule教程详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
PHP伪造referer实例代码
Sep 20 PHP
PHP文件上传主要代码讲解
Sep 30 PHP
php中数字、字符与对象判断函数用法实例
Nov 26 PHP
php利用ffmpeg提取视频中音频与视频画面的方法详解
Jun 07 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
Feb 07 PHP
CMSPRESS 10行代码搞定 PHP无限级分类2
Mar 30 PHP
浅谈PHPANALYSIS提取关键字
Mar 08 PHP
用PHP的反射实现委托模式的讲解
Mar 22 PHP
PHP下用Swoole实现Actor并发模型的方法
Jun 12 PHP
laravel框架创建授权策略实例分析
Nov 22 PHP
基于PHP实现短信验证码发送次数限制
Jul 11 PHP
PHP7 list() 函数修改
Mar 09 PHP
[原创]php使用curl判断网页404(不存在)的方法
Jun 23 #PHP
PHP生成静态HTML文档实现代码
Jun 23 #PHP
PHP微信支付开发实例
Jun 22 #PHP
[原创]解决wincache不支持64位PHP5.5/5.6的问题(提供64位wincache下载)
Jun 22 #PHP
PHP树-不需要递归的实现方法
Jun 21 #PHP
PHP MySql增删改查的简单实例
Jun 21 #PHP
浅谈PHP eval()函数定义和用法
Jun 21 #PHP
You might like
php csv操作类代码
2009/12/14 PHP
PHP源代码数组统计count分析
2011/08/02 PHP
一个基于phpQuery的php通用采集类分享
2014/04/09 PHP
PHP实现非阻塞模式的方法分析
2018/07/26 PHP
js模拟实现Array的sort方法
2007/12/11 Javascript
JQUERY实现左侧TIPS滑进滑出效果示例
2013/06/27 Javascript
jquery动态增加text元素以及删除文本内容实例代码
2013/07/01 Javascript
ie下$.getJSON出现问题的解决方法
2014/02/12 Javascript
用html+css+js实现的一个简单的图片切换特效
2014/05/28 Javascript
jQuery不使用插件及swf实现无刷新文件上传
2014/12/08 Javascript
NodeJS实现阿里大鱼短信通知发送
2016/01/17 NodeJs
javascript垃圾收集机制的原理分析
2016/12/08 Javascript
nodejs使用express创建一个简单web应用
2017/03/31 NodeJs
详解基于 Nuxt 的 Vue.js 服务端渲染实践
2017/10/24 Javascript
Vue 指令实现按钮级别权限管理功能
2019/04/23 Javascript
Vue+element 解决浏览器自动填充记住的账号密码问题
2019/06/11 Javascript
Vue.js递归组件实现组织架构树和选人功能
2019/07/04 Javascript
浅谈Vue3.0之前你必须知道的TypeScript实战技巧
2019/09/11 Javascript
JS中多层次排序算法的实现代码
2021/01/06 Javascript
numpy中以文本的方式存储以及读取数据方法
2018/06/04 Python
python调用pyaudio使用麦克风录制wav声音文件的教程
2019/06/26 Python
python 直接赋值和copy的区别详解
2019/08/07 Python
Python描述数据结构学习之哈夫曼树篇
2020/09/07 Python
用CSS3的box-reflect设置文字倒影效果的方法讲解
2016/03/07 HTML / CSS
HTML5微信播放全屏问题的解决方法
2017/03/09 HTML / CSS
自我评价怎么写好呢?
2013/12/05 职场文书
药品采购员岗位职责
2014/02/08 职场文书
《罗布泊,消逝的仙湖》教学反思
2014/03/01 职场文书
社保代办委托书怎么写
2014/10/06 职场文书
深入开展党的群众路线教育实践活动心得体会
2014/11/05 职场文书
运动会表扬稿范文
2015/05/05 职场文书
2015年小学师德师风建设工作总结
2015/10/23 职场文书
2019各种保证书范文
2019/06/24 职场文书
python正则表达式re.search()的基本使用教程
2021/05/21 Python
JavaScript ES6的函数拓展
2022/01/18 Javascript
关于vue-router-link选择样式设置
2022/04/30 Vue.js