Yii2 требует, чтобы все контроллеры и действия вошли в систему

В моем sitecontroller я пишу вот так

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

Поэтому, если я перейду к указательному или обратному действию, я перейду на страницу входа. но я должен сделать это для всех действий для каждого контроллера. Не могли бы вы сказать мне, как это сделать?

Ответ 1

Поместите это правило в начало раздела 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. Если есть (и, например, они предназначены для разных целей), заблокируйте их явно в соответствующих контроллерах. Но это довольно редкий случай.

Ответ 2

Если вы хотите добавить контроль доступа ко всем действиям вашего контроллера. Пожалуйста, добавьте ниже код в основной файл конфигурации в разделе компонентов.

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

Ответ 3

Если вы полностью опустите часть "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

Попробуйте это в следующем файле.

frontend/config/main.php


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