在我们之前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。具体添加方式可参考下方截图

注意,上面这一步很多人会死在类名的添加上,记得加上我们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详细讲解(转)的更多相关文章

  1. yii2权限控制rbac之rule详细讲解

    作者:白狼 出处:http://www.manks.top/yii2_rbac_rule.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留 ...

  2. yii2权限控制rbac之详细操作步骤

    本篇的主题是 rbac权限控制的详细操作步骤,注意是操作步骤哦,关于配置与rbac的搭建,我们在博文 yii2搭建完美后台并实现rbac权限控制实例教程说的再清楚不过了. 但是,在很多人的反馈下,说是 ...

  3. yii2权限控制rbac之菜单menu最详细教程

    前面我们在博文 yii2搭建完美后台并实现rbac权限控制实例教程中完美实现了yii2的后台搭建和rbac权限控制,如果你还没有实现,请先看上文再回来参考本文,因为本文是在上文的基础上进行完善和补充. ...

  4. yii2 rbac权限控制之菜单menu详细教程

    作者:白狼 出处:http://www.manks.top/article/yii2_rbac_menu本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...

  5. 权限控制-RBAC(Role-Based Access Control)

    RBAC是基于角色的权限访问控制,在RBAC中角色与权限相连,用户通过成为某个角色而得到角色的权限,这就极大的简化了权限的管理,用户和角色多对多,角色和权限多对多,由此产生用户表.角色表.权限表,用户 ...

  6. yii2 rbac权限控制详细操作步骤

    作者:白狼 出处:http://www.manks.top/article/yii2_rbac_description本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出 ...

  7. yii2搭建完美后台并实现rbac权限控制实例教程

    1.安装yii2 未安装的请参考yii2史上最简单式安装教程,没有之一 或者参考yii2实战教程之详细安装步骤 已安装的请继续看下一步操作 2.配置数据库 2.1 配置数据库 修改common/con ...

  8. 浅谈Yii-admin的权限控制

    说到CMS,最需要有的东西就是权限控制,特别是一些复杂的场景,多用户,多角色,多部门,子父级查看等等.最近在开发一个线下销售的东东,这个系统分为管理员端,省代端,客户端,门店端,销售端, 部门端,部门 ...

  9. 认证鉴权与API权限控制在微服务架构中的设计与实现(四)

    引言: 本文系<认证鉴权与API权限控制在微服务架构中的设计与实现>系列的完结篇,前面三篇已经将认证鉴权与API权限控制的流程和主要细节讲解完.本文比较长,对这个系列进行收尾,主要内容包括 ...

随机推荐

  1. 做WEB开发的时候,前端与后端我们应该要注意哪些细节,哪些容易出现的漏洞?

    写这篇文章的时候,我和团队正在处理项目漏洞问题,发现这些都是细节但又容易在项目实现的过程中忽视的部分,鉴于此,我想总结下来,方便以后出现类似问题能及时得到解决. 1.任意文件上传漏洞.   描述:允许 ...

  2. spring spel

    •Spring 表达式语言(简称SpEL):是一个支持运行时查询和操作对象图的强大的表达式语言.   •语法类似于 EL:SpEL 使用 #{…} 作为定界符,所有在大框号中的字符都将被认为是 SpE ...

  3. js截取文件的名称

    var str = 'aaa.fda.asp'; var arr = str.split('.');//通过\分隔字符串,成字符串数组 var last= arr[arr.length - 1];// ...

  4. 72.40个Android面试题(转载)

    1. Android的四大组件是哪些,它们的作用? 答:Activity:Activity是Android程序与用户交互的窗口,是Android构造块中最基本的一种,它需要为保持各界面的状态,做很多持 ...

  5. [日常训练]FJ省夏令营day1

    T1 Description 给出n个矩形的顶点坐标(每个矩形的底边都在x轴上),求这n个矩形所组成图形的轮廓线的顶点. Input 第一行一个整数n,表示矩形个数. 以下n行,每行3个整数,分别表示 ...

  6. Leetcode Integer Replacement

    Given a positive integer n and you can do operations as follow: If n is even, replace n with n/2. If ...

  7. PHP守护进程

    php也是可以直接进行守护进程的启动与终止的,相对于shell来说会简单很多,理解更方便,当然了php的守护进程要实现自动重启还是要依赖于shell的crontab日程表,每隔一段时间去执行一次脚本看 ...

  8. [JavaEE] NIO与IO的区别

    nio是new io的简称,从jdk1.4就被引入了.现在的jdk已经到了1.6了,可以说不是什么新东西了.但其中的一些思想值得我来研究.这两天,我研究了下其中的套接字部分,有一些心得,在此分享. 首 ...

  9. Loadrunner关联取参及设置检查点

    Loadrunner关联取参及设置检查点: 获取post的响应值当作参数存储,要在此post请求之上添加 web_reg_save_param("sign", "LB=m ...

  10. 无法启动此程序,因为计算机中丢失MSVCP110.dll

    安装Visual C++ Redistributable for Visual Studio 2012 有arm.x86.x64有三个版本. 如果应用程序为debug版本而不是release版本,可能 ...