2017-04-20 8 views
0

이것은 처음에는 중복 될 수 있지만 사용 가능한 답변에는 선명도가없고 내 문제를 해결하지 못합니다.Yii2의 사용자 역할, DB 값

사용자의 데이터베이스 목록이 있는데, 하나의 튜플은 다음과 유사합니다.

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

이제 관리자라는 유형의 사용자를 만들고 컨트롤러에서 이와 같은 액세스 제어를 설정하려고합니다.

'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 자신의 답변에 따라

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

을 다음과 같이 matchRole 방법을 편집 내가 볼 그렇지 정말 업체 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입니다.