web-dev-qa-db-ja.com

Yii2はログインするためにすべてのコントローラーとアクションを必要とします

私のサイトコントローラーでは、このように書きます

    'access' => [
        'class' => AccessControl::className(),
        'rules' => [
            [
                'actions' => ['login', 'error'],
                'allow' => true,
            ],
            [
                'actions' => ['logout', 'index' ,'call-back'], // add all actions to take guest to login page
                'allow' => true,
                'roles' => ['@'],
            ],
        ],
    ],

インデックスまたはコールバックアクションに移動すると、ログインページにリダイレクトされます。しかし、私は各コ​​ントローラーへのすべてのアクションのためにそれをしなければなりません。最善の方法を教えてください。

14
Ngoun Thavy

この規則をrulesセクションの先頭に配置します。

[
    'allow' => true,
    'roles' => ['@'],
],

actionsを省略すると、すべてのアクションが意味されます。

したがって、AccessControlの設定は次のようになります。

public function behaviors()
{
    return [
        'access' => [
            'class' => AccessControl::className(),
            'rules' => [
                [
                    'allow' => true,
                    'roles' => ['@'],
                ],

                // ...
            ],
        ],
    ];
}

ルールは宣言された順に適用されることに注意してください。

継承せずにグローバルに行うには、as beforeRequest以下の配列(内部ではありません!)アプリケーション構成のcomponents宣言:

'components' => [ ... ],
'as beforeRequest' => [
    'class' => 'yii\filters\AccessControl',
    'rules' => [
        [
            'allow' => true,
            'actions' => ['login'],
        ],
        [
            'allow' => true,
            'roles' => ['@'],
        ],
    ],
    'denyCallback' => function () {
        return Yii::$app->response->redirect(['site/login']);
    },
],

このコードは各リクエストの前に実行され、ゲストのloginを除くすべてのアクションをブロックします。

login以外のコントローラーにSiteControllerアクションがないことを確認してください。存在する場合(たとえば、目的が異なる場合)、コントローラに従って明示的にブロックします。しかし、それは非常にまれなケースです。

30
arogachev

すべてのコントローラーアクションにアクセス制御を追加する場合。コンポーネントセクションの下のメイン設定ファイルに以下のコードを追加してください。

'as access' => [
        'class' => \yii\filters\AccessControl::className(),//AccessControl::className(),
        'rules' => [
            [
                'actions' => ['login', 'error'],
                'allow' => true,
            ],
            [
                'actions' => ['logout', 'index'], // add all actions to take guest to login page
                'allow' => true,
                'roles' => ['@'],
            ],
        ],
    ],
6

配列から「actions」部分を完全に省略した場合、コントローラーのすべてのアクションに対して有効になります。

すべてのコントローラーに対してそれを行いたい場合は、間にレイヤーを追加するだけです:

class MyAccessController extends \yii\web\Controller
{
    public function behaviors() 
    {
         return [
            'access' => [
            'class' => AccessControl::className(),
            'rules' => [
                [
                   'actions' => ['login', 'error'],
                   'allow' => true,
                ],
                [
                   'allow' => true,
                   'roles' => ['@'],
                ],
             ],
         ];
     }       
 }

そして、そのクラスからcontrollerを派生させます。または、それをtraitに入れて、各コントローラーでuseに追加して使用できます。

4
Blizz

これを次のファイルで試してください。

frontend/config/main.php


components =>[ your stuff ],
'as beforeRequest' => 
            [
                'class' => 'yii\filters\AccessControl',
                'rules' =>  [
                                [
                                     'actions' => ['login', 'error'],
                                     'allow' => true,
                                ],
                                [
                                    'allow' => true,
                                    'roles' => ['@'],
                                ],
                            ],
            ],
0
vijay nathji