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中防止伪造跨站请求的小招式
Sep 02 PHP
php中将汉字转换成拼音的函数代码
Sep 08 PHP
通过PHP current函数获取未知字符键名数组第一个元素的值
Jun 24 PHP
浅析PHP中的UNICODE 编码与解码
Jun 29 PHP
PHP父类调用子类方法的代码例子
Apr 09 PHP
php中用memcached实现页面防刷新功能
Aug 19 PHP
CodeIgniter分页类pagination使用方法示例
Mar 28 PHP
php 数组字符串搜索array_search技巧
Jul 05 PHP
Zend Framework入门教程之Zend_Registry组件用法详解
Dec 09 PHP
PHP自动识别当前使用移动终端
May 21 PHP
CI框架附属类用法分析
Dec 26 PHP
PHP 实现文件压缩解压操作的方法
Jun 14 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 curl 登录163邮箱并抓取邮箱好友列表的代码(经测试)
2011/04/07 PHP
通过缓存数据库结果提高PHP性能的原理介绍
2012/09/05 PHP
PHP移动文件指针ftell()、fseek()、rewind()函数总结
2014/11/18 PHP
php使用iconv中文截断问题的解决方法
2015/02/11 PHP
PHP+Apache+Mysql环境搭建教程
2016/08/01 PHP
PHP入门教程之数学运算技巧总结
2016/09/11 PHP
Laravel接收前端ajax传来的数据的实例代码
2017/07/20 PHP
浅谈PHP中的Trait使用方法
2019/03/22 PHP
关于实现代码语法标亮 dp.SyntaxHighlighter
2007/02/02 Javascript
jquery取子节点及当前节点属性值的方法
2014/09/09 Javascript
解决js下referer兼容各大浏览器的方法
2014/11/03 Javascript
javascript实现根据iphone屏幕方向调用不同样式表的方法
2015/07/13 Javascript
简单谈谈Vue 模板各类数据绑定
2016/09/25 Javascript
JS区分Object与Aarry的六种方法总结
2017/02/27 Javascript
在vue中,v-for的索引index在html中的使用方法
2018/03/06 Javascript
vue better scroll 无法滚动的解决方法
2018/06/07 Javascript
微信小程序wx.navigateTo方法里的events参数使用详情及场景
2020/01/07 Javascript
JavaScript实现简单的弹窗效果
2020/05/19 Javascript
[02:50]【扭转乾坤,只此一招】DOTA2全新版本永雾林渊开启新篇章
2020/12/24 DOTA
Python中subprocess模块用法实例详解
2015/05/20 Python
Python基于smtplib实现异步发送邮件服务
2015/05/28 Python
在Linux下使用Python的matplotlib绘制数据图的教程
2015/06/11 Python
Python统计python文件中代码,注释及空白对应的行数示例【测试可用】
2018/07/25 Python
浅谈pycharm出现卡顿的解决方法
2018/12/03 Python
python 多进程并行编程 ProcessPoolExecutor的实现
2019/10/11 Python
Django Serializer HiddenField隐藏字段实例
2020/03/31 Python
Django模板标签{% for %}循环,获取制定条数据实例
2020/05/14 Python
css3实现小箭头各种图形效果
2020/07/08 HTML / CSS
设计师家具购买和委托在线市场:Viyet
2016/11/16 全球购物
制衣厂各岗位职责
2013/12/02 职场文书
家长给孩子的评语
2014/01/30 职场文书
刘公岛导游词
2015/02/05 职场文书
中班下学期个人工作总结
2015/02/12 职场文书
图解上海144收音机
2021/04/22 无线电
python使用pywinauto驱动微信客户端实现公众号爬虫
2021/05/19 Python
利用python实时刷新基金估值(摸鱼小工具)
2021/09/15 Python