2015-09-08 103 views
0

我試圖通過遵循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'))測試許可。

  1. 首先,我想知道爲什麼在這裏需要控制檯命令,因爲我無法看到它在哪裏被使用。

  2. execute方法中的$ item參數的值爲search,但本教程顯示它期望此值爲角色類型。

  3. 不管我在執行方法中返回什麼,它似乎返回false。

任何人都可以回答這些問題嗎?

回答

0

我想你有DbManager的authManager?

'authManager' => [ 
     'class' => 'yii\rbac\DbManager', 
    ], 
  1. 給init從控制檯RBAC只是在一個控制檯使用yii rbac/init(在正確的項目目錄),那麼數據庫條目中進行(在這之前的RBAC表應該是空的)

    如果你還沒有完成創建表

    yii migrate [email protected]/rbac/migrations 
    
  2. $ item只是auth權限或角色條目。如果您已添加規則,則會爲每個條目調用該規則。在你的情況下,「搜索」權限和角色「用戶」和「管理員」的規則執行。

  3. 您已添加條目與規則檢查。所以,如果你檢查用戶是否可以通過例如「搜索」

    if (\Yii::$app->user->can('search')) { 
    // can search 
    } 
    

    然後檢查或執行規則(這是您的UserGroupRule)。在你的情況下,它將返回trueadminsfalseusergroup字段給出。

編輯: 我希望你已經在你的配置文件將此添加到您的組件。

return [ 
// ... 
'components' => [ 
    'authManager' => [ 
     'class' => 'yii\rbac\DbManager', 
    ], 
    // ... 
], 
]; 

您已經於您的RBAC(用戶/管理員)創建兩個角色,並就我理解你的用戶表使用一組列分配給用戶的角色。而在你的代碼中,你將需要檢查權限或角色。所以從DB中選擇正確的條目,並且如果附加了規則,則執行該規則。這將檢查當前用戶組並返回true或false。所以在你的情況下,沒有分配給這些角色或權限。它使用規則根據用戶組返回true或false。但是,這裏有其他擴展搜索yii2admin或yii2rbac,您也可以在其中通過數據庫條目將用戶分配給角色/權限等。

我想說,你應該得到更多的幫助,你可以「聊天」,例如在yii主頁上鍊接的yii聊天。

+0

感謝您的回覆。是的,我應該提到我正在使用DbManager,而且我已經運行了控制檯腳本來填充表格。然而,你會看到註釋行中的執行返回true,但這似乎並沒有註冊'if(\ Yii :: $ app-> user-> can('search'));'。你讓我感到鼓舞,我在正確的軌道上,當我在早上上班時,我會再看看它。 – Dubby

+0

我會嘗試調試,如果你的'$ group = Yii :: $ app-> user-> identity-> group;'正確返回。管理員用戶必須爲「1」,普通用戶必須爲「2」。嘗試在你的'UserGroupRule'中打印出來(Yii :: $ app-> user-> identity-> group);'當您測試「搜索」權限時。 – BHoft

+0

'然而,你會看到註釋行中的執行返回true,但這似乎並沒有註冊if(\ Yii :: $ app-> user-> can('search'));'必須工作。如果您在規則中返回true,則無論您的用戶在您的檢查權限中是否有效,並且它不會返回true,那麼其他情況都是錯誤的。你的規則是否被執行?嘗試'死('測試');' – BHoft