2017-02-15 12 views
0

yii2アクセスコントロールフィルタを使用して遊んだ後、私は多くの役に立ちましたAnswerを訪れました。私は以下を実行してアクセスを制限しようとしました:Yii2制限付きAccessControlFilterロジック

thisに基づいて私はAccessRuleを作成しました。私は次のロジックを追加しました。

... 
// Check if the user is logged in, and the roles match 
} elseif (!$user->getIsGuest() && $role === '#' && $user->can("admin")) { 
    return true; 
} elseif (!$user->getIsGuest() && $role === '~' && $user->can("admin")) { 
    return true; 
} 
... 

$user->can("admin")方法はthisシンプルyii2のユーザ認証モジュールから来ているのに対し。

私の考えは、デフォルトですべてを制限し、必要に応じてアクション/サイドを開くことです。

は私が(web.php)を意味

... 
'as beforeRequest' => [ 
    'class' => 'yii\filters\AccessControl', 
    'ruleConfig' => [ 
       'class' => 'app\components\AccessRule' 
      ], 
    'rules' => [ 
     [ 
      'allow' => true, 
      'roles' => ['#'], 
     ], 
     ... 

私の設定に次の追加、役割の管理を持っているユーザーは、すべてを行うために許可されています。他のすべてのロール/ユーザー(ゲスト、@または~(ログインしているが管理者の役割はありません))は、これまで何もできません。

もちろん、ロール~のユーザーは、何かをすることを許可されるべきです。だから、私は1つのコントローラの許可を開いて、まだ役割~でUnfortanatlyユーザに次の動作

public function behaviors() 
{ 
    return [ 
     'access' => [ 
      'class' => AccessControl::className(), 
      'ruleConfig' => [ 
       'class' => AccessRule::className() 
      ], 
      'only' => ['index'], 
      'rules' => [ 
       [ 
        'actions' => ['index'], 
        'allow' => true, 
        'roles' => ['~'], 
       ], 
      ], 
     ], 
... 

を追加することはできませんアクセスそのspezifiedコントローラのアクションのインデックス。

私の論理/思考は不適切ですか?

アクセス制御フィルタを呼び出すシーケンスに問題がありますか?

+0

try @ instead〜 – bxN5

+0

@Roman コントローラの動作を '@'に変更しました。ユーザーはあなたのコードから読み取ることができる限り、サイト – Luc

答えて

0

私はこのように実行します。

$GLOBALS['role'] = json_decode(Yii::$app->session->get('ROLES'), TRUE); // my roles 

と、この私の行動である()関数:

public function behaviors() { 
     return [ 
      'access' => [ 
       'class' => \yii\filters\AccessControl::className(), 
       'only' => ['create', 'update', 'delete', 'index', 'profile', 'timeline', 'upload'], 
       'rules' => [ 
        [ 
         'actions' => ['index', 'view', 'create', 'update', 'delete', 'profile', 'timeline', 'upload'], 
         'allow' => true, 
         'roles' => ['@'], 
         'matchCallback' => function() { 
          return ($this->CheckPermission()) ? TRUE : $this->redirect(['site/errorpage']); 
         }, 
        ], 
       ], 
      ], 
     ]; 
    } 

そして、私はのcheckPermission()関数を作成するよりも、後:

protected function CheckPermission() { 
     $action = $this->action->id; 

     switch ($action) { 
      case 'create': 
       if ($GLOBALS['role'][90]) 
        return TRUE; 
       break; 
      case 'update': 
       if ($GLOBALS['role'][91]) 
        return TRUE; 
       break; 
      case 'delete': 
       if ($GLOBALS['role'][92]) 
        return TRUE; 
       break; 
      case 'index': 
       if ($GLOBALS['role'][93]) 
        return TRUE; 
       break; 

      default: return TRUE; 
     } 
     return FALSE; 
    } 

の場合チェックパーミッションを返します。trueを返します。そうでなければ、ユーザーは許可されます。

+0

にまだアクセスすることはできません。あなたのソリューションでは、すべてのコントローラに対して振る舞いのfunktionを追加/変更する必要があります。私の考えは、誰もが許可を拒否できるようにし、特定のコントローラに特別な許可を加えるだけです。 – Luc