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. 測試. 創建一個新用戶, 爲新用戶分配上面創建的角色, 使用新用戶登錄嘗試刪除其他分類,

發佈了16 篇原創文章 · 獲贊 0 · 訪問量 4240
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章