web-dev-qa-db-fra.com

Yii2 nécessite que tous les contrôleurs et actions se connectent

Dans mon contrôleur de site j'écris comme ça

    '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' => ['@'],
            ],
        ],
    ],

donc, si je passe à l'action d'indexation ou de rappel, je serai redirigé vers la page de connexion. mais je dois le faire pour toute action à chaque contrôleur. Pourriez-vous me dire la meilleure façon de le faire?

14
Ngoun Thavy

Placez cette règle au début de la section rules:

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

L'omission de actions signifie toutes les actions.

Ainsi, votre AccessControl config sera comme ceci:

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

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

Gardez à l'esprit que les règles sont appliquées afin d'être déclarées.

Pour le faire globalement sans héritage, ajoutez le as beforeRequest tableau ci-dessous (pas à l'intérieur!) la déclaration components dans la configuration de votre application:

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

Ce code s'exécutera avant chaque demande et bloquera toutes les actions sauf login pour les invités.

Assurez-vous qu'il n'y a pas d'action login dans d'autres contrôleurs que SiteController. S'il y en a (et par exemple ils sont à des fins différentes), bloquez-les explicitement dans les contrôleurs correspondants. Mais c'est un cas assez rare.

30
arogachev

Si vous souhaitez ajouter un contrôle d'accès à toutes vos actions de contrôleur. Veuillez ajouter le code ci-dessous dans le fichier de configuration principal sous la section des composants.

'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
Ravindra Bhalothia

Si vous omettez complètement la partie "actions" du tableau, elle sera valable pour toutes les actions du contrôleur.

Si vous voulez le faire pour chaque contrôleur, ajoutez simplement une couche entre les deux:

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

Et puis dérivez votre controller de cette classe. Ou vous pouvez le mettre dans un trait et utiliser l'ajouter avec un use dans chaque contrôleur.

4
Blizz

Essayez ceci dans le fichier suivant.

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