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