2017-04-20 26 views
0

這聽起來可能會重複,但可用的答案不夠清晰,並不能解決我的問題。Yii2中的用戶角色,來自DB值

我有一個數據庫的用戶列表,一個元組看起來像下面這樣。

[ 
     'id' => '131', 
     'username' => 'mat', 
     'password' => '9a23b6d49aa244b7b0db52949c0932c365ec8191', 
     'authKey' => 'test100key', 
     'accessToken' => '100-token', 
     'role' => 'editor', 
    ] 

現在我想創建一個叫做manager的用戶類型,並在控制器中設置這樣的訪問控制。

'access' => [ 
      'class' => AccessControl::className(), 
      'rules' => [ 
       [ 
        'actions' => ['create', 'view', 'index'], // Define specific actions 
        'allow' => true, // Has access 
        'roles' => ['editor'], // '@' All logged in users/or your access role e.g. 'admin', 'user' 
       ], 
       [ 

我試圖用最小的麻煩來實現這一點,我不是很熟悉yii/yii2。 RBAC實際上讓我感到困惑,我發現很難理解文檔。

我只需要創建三種類型的用戶角色。我理解控制對各種行爲的訪問。

用戶數據來自一個表格,它將被另一個應用程序實時修改。

回答

0

自己解決。在框架代碼中稍作調整,如果我選擇隨時更新Yii,我想我會面臨麻煩。

供應商/ yiisoft/yii2 /過濾器/ AccessRule.php 編輯matchRole方法根據你自己的答案如下

protected function matchRole($user) 
{ 
    if (empty($this->roles)) { 
     return true; 
    } 
    foreach ($this->roles as $role) { 
     if ($role === '?') { 
      if ($user->getIsGuest()) { 
       return true; 
      } 
     } elseif ($role === '@') { 
      if (!$user->getIsGuest()) { 
       return true; 
      } 
     } elseif ($user->can($role)) { 
      return true; 
     } 
     elseif (isset($user->identity->role)){ 
      if($role == $user->identity->role) { 
       return true; 
      } 
     } 
    } 

    return false; 
} 
1

我看你真的不需要RBAC,這只是檢查用戶的一個屬性的問題。您可以直接在控制器做到這一點(和你不得修改核心文件反正):

在控制器添加:

public function behaviors() 
{ 
    return [ 
     'access' => [ 
      'class' => \yii\filters\AccessControl::className(), 
      'only' => ['create', 'view', 'index'], 
      'rules' => [ 
       [ 
        'allow' => true, 
        'matchCallback' => function ($rule, $action) { 
         return !\Yii::$app->user->isGuest 
          && \Yii::$app->user->identity->role === 'editor'; 
        }, 
       ], 
      ], 
     ], 
    ]; 
} 

matchCallback是將被調用,以確定該規則應該回調應用。您需要先檢查用戶是否不是客人,否則Yii::$app->user->identitynull