Yii2权限控制RBAC之rule规则的用法

      使用yii\rbac\DbManager配置authManager必须生成四张表,其中的auth_rule表就是存放的规则信息. 规则给角色和权限增加额外的约束条件, 要使用规则, 我们首先必须创建规则类, 该类必须继承yii\rbac\Rule, 并且要实现excute()方法.

      使用规则大体流程:

  • 根据业务逻辑创建一个规则类;
  • 将规则添加至auth_rule表中, 实例化该规则类, 使用authManager的add()方法,传入实例化的对象,即可将规则类添加至auth_rule表中;
  • 创建权限或者角色,指定权限或者的authName属性为规则类中定义的$name属性的值, 即可将权限或角色与规则关联起来;
  • 为角色分配权限, 为用户分配角色

      使用场景举例: 商城后台分类管理中,管理员A创建的分类只允许管理员A来删除.

      1. 我们可以创建这样一条规则.

<?php

namespace app\models;

use Yii;
use yii\rbac\Rule;
use app\models\Category;

class AuthorRule extends Rule{

    public $name = 'isAuthor'; //规则的名称

    /**
     * @param string|integer $user 用户 ID.
     * @param Item $item 该规则相关的角色或者权限
     * @param array $params 传给 ManagerInterface::checkAccess() 的参数
     * @return boolean 代表该规则相关的角色或者权限是否被允许
     */
    public function execute($user, $item, $params){
        $action = Yii::$app->controller->action->id; //获取当前控制器的方法,只对del方法进行判断
        if($action == 'del'){
            $cateId = Yii::$app->request->get('cateid'); //获取当前删除的分类id
            $cateInfo = Category::findOne($cateId);
            return $cateInfo->adminid==$user;
        }
        return true;
    }
}

      由于本规则只对分类的删除动作来进行权限控制,因此这里先获取当前操作的方法名进行判断, 在点击删除按钮的时候会携带cateid, 所以这里和Yii2官方文档的例子不同的是没有在$params中进行传递参数.

      规则类定义好之后, 我们要将它添加到auth_rule表中.  上面提到, 要将一个规则类添加到规则表中, 只需要实例化该类, 并将实例化的对象作为参数传入authManager的add()方法中即可. 首先,创建一个简单的页面提交规则类的名称

在控制器中接收提交的数据,并将规则类添加到auth_rule表中.

/**
     * 添加规则
     */
    public function actionCreaterule(){
        if(Yii::$app->request->isPost){
            $post = Yii::$app->request->post();
            if(empty($post['class_name'])){
                throw new yii\db\Exception('参数错误');
            }
            $className = "app\\models\\".$post['class_name'];
            if(!class_exists($className)){
                throw new \Exception('规则类不存在!');
            }
            $rule = new $className;
            if(Yii::$app->authManager->add($rule)){
                Yii::$app->session->setFlash('info','添加规则成功!');
            }
        }
        return $this->render("_createrule");
    }

      2. 创建角色, 并将角色和规则关联起来.

      这里的名称是角色名称(用中文), 标识对应的是角色描述(用英文), 例如创建管理员admin, 名称: 管理员, 标识: admin. 注意这里的规则名称要填上面创建的规则类中定义的公共属性$anme的值,如: isAuthor.

后台接收表单提交数据:

 /**
     * 创建角色
     * @return string
     */
    public function actionCreaterole(){
        if(Yii::$app->request->isPost){
            $auth = Yii::$app->authManager;
            $role = $auth->createRole(null);
            $post = Yii::$app->request->post();
            if(empty($post['name'] || $post['description'])){
                Yii::$app->session->setFlash('info','名称或标识不能为空!');
                return $this->render('_createitem');
            }
            $role->name = $post['name'];
            $role->description = $post['description'];
            $role->ruleName = empty($post['rule_name']) ? null : $post['rule_name'];
            $role->data = empty($post['data']) ? null : $post['data'];
            if($auth->add($role)){
                Yii::$app->session->setFlash('info','添加角色成功!');
            }
        }
        return $this->render('_createitem');
    }

3. 为角色分配权限(在之前的博客中已经记录).

4. 为用户分配角色(之前博客中已记录)

5. 测试. 创建一个新用户, 为新用户分配上面创建的角色, 使用新用户登录尝试删除其他分类,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值