我試圖通過遵循Yii網站上的教程*在我的項目中實現RBAC。但是,當我嘗試按組來實現權限時,我感到困惑。Yii2 RBAC組分配混淆
對於此示例,我在用戶表中添加了group
字段,並定義了兩個組user (2)
和admin (1)
。
然後我創建了一個控制檯命令看起來像這樣:
class RbacController extends Controller
{
public function actionInit()
{
$auth = \Yii::$app->authManager;
$rule = new \app\rbac\UserGroupRule;
$auth->add($rule);
$search = $auth->createPermission('search');
$search->description = 'Search';
$search->ruleName = $rule->name;
$auth->add($search);
$user = $auth->createRole('user');
$user->ruleName = $rule->name;
$auth->add($user);
$admin = $auth->createRole('admin');
$admin->ruleName = $rule->name;
$auth->add($admin);
$auth->addChild($admin, $user);
}
}
而且我有這個文件:RBAC/UserGroupRule.php
class UserGroupRule extends Rule
{
public $name = 'userGroup';
public function execute($user, $item, $params)
{
// return true; // force return to true for test
if(!Yii::$app->user->isGuest) {
$group = Yii::$app->user->identity->group;
if($item->name === 'search') {
return $group == 1;
}
return false;
}
}
我試圖用if(\Yii::$app->user->can('search'))
測試許可。
首先,我想知道爲什麼在這裏需要控制檯命令,因爲我無法看到它在哪裏被使用。
execute方法中的$ item參數的值爲
search
,但本教程顯示它期望此值爲角色類型。不管我在執行方法中返回什麼,它似乎返回false。
任何人都可以回答這些問題嗎?
感謝您的回覆。是的,我應該提到我正在使用DbManager,而且我已經運行了控制檯腳本來填充表格。然而,你會看到註釋行中的執行返回true,但這似乎並沒有註冊'if(\ Yii :: $ app-> user-> can('search'));'。你讓我感到鼓舞,我在正確的軌道上,當我在早上上班時,我會再看看它。 – Dubby
我會嘗試調試,如果你的'$ group = Yii :: $ app-> user-> identity-> group;'正確返回。管理員用戶必須爲「1」,普通用戶必須爲「2」。嘗試在你的'UserGroupRule'中打印出來(Yii :: $ app-> user-> identity-> group);'當您測試「搜索」權限時。 – BHoft
'然而,你會看到註釋行中的執行返回true,但這似乎並沒有註冊if(\ Yii :: $ app-> user-> can('search'));'必須工作。如果您在規則中返回true,則無論您的用戶在您的檢查權限中是否有效,並且它不會返回true,那麼其他情況都是錯誤的。你的規則是否被執行?嘗試'死('測試');' – BHoft