Глобальный фильтр/поведение Yii2, чтобы заставить пользователя сначала пройти аутентификацию


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

В Yii1 я сделал это, создав класс, который проверял бы, вошел ли пользователь в систему, и прикрепил этот класс к поведению onBeginRequest в моем основном файле конфигурации.

// Yii 1
'behaviors' => array(
    'onBeginRequest' => array(
        'class' => 'application.components.RequireLogin',
    )
),

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

Метод рабочего поведения выглядит следующим образом:

// Yii2
public function behaviors() {
    return [
        'access' => [
            'class' => AccessControl::className(),
            'rules' => [
                [
                    'actions' => ['login', 'error'],
                    'allow' => true,
                ],
                [
                    'allow' => true,
                    'roles' => ['@'],
                ],
            ],
        ],
    ];
}
Author: jagsler, 2014-09-23

2 answers

Хорошо, поэтому мне пришлось добавить следующий код ниже 'components' => [...]

 'as beforeRequest' => [
    'class' => 'yii\filters\AccessControl',
    'rules' => [
        [
            'actions' => ['login', 'error'],
            'allow' => true,
        ],
        [

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

Подробнее о формате читайте: http://www.yiiframework.com/doc-2.0/guide-concept-configurations.html#configuration-format

 28
Author: jagsler, 2014-11-19 17:19:55

На самом деле я не разбираюсь в Yii2 (но очень хорошо разбираюсь в Yii1).

Одним из решений, которое может быть использовано в Yii1 и, я думаю, также в Yii2, является использование метода фильтра в классе главного контроллера. Обычно один контроллер служит в качестве главного контроллера. Если у вас его нет, создайте его, и все должны его расширить. Вы можете реализовать это, вероятно, не как фильтр, а в других методах этого "главного контроллера" (init()?) Если вся активность проходит через класс контроллера, то вы готовы.

 -1
Author: Boaz Rymland, 2014-09-23 18:27:03