Yii2 rbac許可權控制之Rule實現及應用詳解
對於一般的許可權系統而言,我們之前做的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.分別用管理員帳號和普通使用者登入系統修改這兩篇文章,結論自然是滿足我們一開始所提的需求,管理員兩篇文章均可修改,普通使用者只能修改自己的文章