2014-11-05 72 views
11

迄今爲止,我一直在使用Yii 1.1.14開發web應用程序,但現在是升級的時候了。對Yii2 RBAC的懷疑

我工作的公司開發了自己的訪問控制系統,直到我看到它真的是什麼樣子的時候,我才真正確定...數據庫中8個表的組合(不包括用戶表) ,還有一堆外鍵。

  • 1表控制器
  • 1表的行動
  • 1表的菜單類別
  • 1表類型的用戶
  • 而其他表的基本上只是連接2個或3個這些表一次。

它運作良好,但在我看來它是非常費時維護所有這些表,並在某些時候,當你的應用程序上線,如果它擊中了一定的用戶量也可以得到很慢。特別是因爲其中的2個表具有用戶的表主鍵作爲外鍵。

所以我決定,當我開始在Yii 2上開發時,我將開始使用RBAC,所以我開始在線尋找教程......只找到作者角色的許多不同版本的相同代碼,以及創建或更新帖子的權限。

我在Youtube上發現了5個視頻的組合,但它們都是關於Yii 1 RBAC的。他們是有幫助的,因爲我設法瞭解了RBAC的大部分功能,但是我仍然有一些疑問,我會在下面列舉一下 。請記住,對於此訪問控制系統,我使用的是DBManager類。

我的疑惑

  1. 的Yii 1的RBAC使用有3個表:auth_assignmentauth_itemauth_item_child。現在在Yii 2 RBAC中,出現一個名爲auth_rule的新表,我仍然不明白那個特定表在那裏做什麼,如何使用它或如何填充它。

  2. 我看到可以通過使用控制器的行爲方法來限制用戶對某些動作的訪問,並根據用戶的角色爲某些動作分配訪問權限,但是當涉及到這個時,我必須將我的問題分解爲2:

    2.1。 第一條:如果您可以通過在behavior方法中設置操作來限制對操作的訪問,那麼對auth_item表保存權限有什麼用處?

    2.2。 Second:如果你決定根據權限控制訪問,那麼你到底該怎麼做,因爲我發現自己在每個函數中都寫了下列類型的代碼,我不認爲使用RBAC應該是這樣的乏味。必須有另一種方式。

    public function actionView($id) 
    { 
        if(Yii::$app->user->can('view-users')){ 
         return $this->render('view', [ 
          'model' => $this->findModel($id), 
         ]); 
        }else{ 
         #Redirect to a custom made action that will show a view 
         #with a custom error message 
         $this->redirect(['//site/notauthorized']); 
        } 
    } 
    
  3. 因爲我們現在使用的門禁系統,當用戶登錄時,一個複雜的查詢被執行,將最終返回將被保存爲一個會話變量數組,將是用於創建一個菜單,其中包含與菜單類別一樣多的下拉列表,用戶有權訪問的控制器屬於該菜單。 RBAC如何做到這一點?

回答

0

對於在您的控制器AccessControl下使用RBAC,Yii2需要一點設置。我通過製作自己的AccessRule文件來解決這個問題。

namespace app\components; 

use Yii; 

class AccessRule extends \yii\filters\AccessRule 
{ 
    protected function matchRole($user) 
    { 
     if (empty($this->roles)) { 
      return true; 
     } 
     foreach ($this->roles as $role) { 
      if(Yii::$app->authManager->checkAccess($user->identity->code, $role)) 
       return true; 
     } 
     return false; 
} 

然後在你的控制器u可以使用這樣的事情:

public function behaviors() 
{ 
    return [ 
     'access' => [ 
      'class' => AccessControl::className(), 
      'ruleConfig' => [ 
       'class' => 'app\components\AccessRule' 
      ], 
      'rules' => [ 
       [ 
        'actions' => ['index', 'resource-type'], 
        'allow'=> true, 
        'roles' => ['admin'], 
       ], 
      ], 
     ], 
    ]; 
} 

其中,管理被定義爲auth_item和用戶在auth_item_assignments。

2

我只能真正回答你的問題2.2,因爲3聽起來根本不像RBAC應該做的事情。但是,如果您遵循了與您的控制器或操作相匹配的命名約定,那麼您最有可能從規則表中獲取所需的信息。

在回答到2.2,但:

你可以簡單的設置像這樣的行爲:

public function behaviors() 
{ 
    return [ 
     'access' => [ 
      'class' => AccessControl::className(), 
      'rules' => [ 
       [ 
        'allow' => true, 
        'actions' => ['view'], 
        'roles' => ['view-users'], //<-- Note, rule instead of role 
       ], 
     ] 
    ] 
} 

這並沒有解決「視圖 - 擁有 - 用戶權限的風格不同的問題,這需要檢查ActiveRecord模型(至少在我的應用程序中)。如果你想做到這一點,看看我的崗位在這裏的Yii論壇:

http://www.yiiframework.com/forum/index.php/topic/60439-yii2-rbac-permissions-in-controller-behaviors/#entry269913

0

正如我已經創建了一個新的RBAC系統yii2。您可以直接授予某個操作的權限,並且操作將顯示您不是此操作的授權者。

通過這個,你會發現你只會提供需要識別的操作。

我上傳了我的詳細資料,在這裏你可以找到很多解決方案here

+1

你應該在這裏寫出答案的相關部分,而不只是鏈接到一些資源。 – GMchris 2016-02-24 13:43:37

1

我在最簡單的方法之一中使用它,我在我的控制器的行爲中使用它們。

public function behaviors() 
    { 

     return [ 
      'access' => [ 
       'class' => \yii\filters\AccessControl::className(), 
       'rules' => [ 
        [ 
         'allow' => true, 
         'roles' => ['sysadmin'], 
         'actions' => ['index','view','update'], 
        ], 
        [ 
         'allow' => true, 
         'roles' => ['staff'], 
         'actions' => ['index','create','update','view'], 
        ], 
       ], 
      ], 
     ]; 

    } 

這裏的角色是在數據庫中,auth-項目表中創建的,他們被分配在AUTH-分配表用戶。在行爲中,我們只是像上面那樣使用它。在上面的代碼中,系統管理員可以訪問索引,查看和更新​​操作,而員工可以訪問索引,創建,更新和查看操作。

0

這是最好的解決方案,當面臨需要按權限過濾訪問時,可能會遇到這種問題,但這很麻煩,但如果您想在高效環境中創建角色並想使用rbac,可能會非常有用。

use yii\web\ForbiddenHttpException; 


if(Yii::$app->user->can('view-users')){ 
    return $this->render('view', [ 
     'model' => $this->findModel($id), 
    ]); 
}else{ 
    throw new ForbiddenHttpException('You dont have access to this site'); 
}