在咱們以前yii2搭建後臺以及rbac詳細教程中,不知道你曾經疑惑過沒有一個問題,rule表是作什麼的,爲何在整個過程當中咱們都沒有涉及到這張表?php
相信我不說,部分人也都會去嘗試,或百度或google,到頭來也會竹籃打水,這部分講解的內容少之又少啊!html
對於通常的權限系統而言,咱們以前作的rbac通常狀況下是足夠的,即時沒有rule,相信你也能實現咱們用rule實現的功能。yii2
咱們就以官網的例子給出一個具體的操做教程,看看這個神祕的rule究竟是作什麼的!app
看需求:yii
咱們有管理員和普通用戶,對於文章系統而言,咱們容許管理員對文章的任何操做,可是隻容許普通用戶建立文章和修改本身建立的文章,注意哦,是容許其修改本身建立的文章,不是不容許修改文章,也不是修改全部的文章!ide
看yii2 rbac rule怎麼去實現,重點是教你們怎麼去使用這個rule,也解開衆多人心中的節!測試
在咱們添加rule以前,須要先實現 yii\rbac\Rule類的execute方法。ui
<?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。具體添加方式可參考下方截圖google
注意,上面這一步不少人會死在類名的添加上,記得加上咱們ArticleRule文件所在的命名空間!spa
咱們看第三步,該步驟也是很容易出錯的地方!該篇教程請注意集中精力,前方高能!
咱們訪問權限列表(/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認證起做用了沒呢?
測試步驟以下可作參考: