Перенаправление на страницу, отличную от входа в систему Yii 2

Есть ли способ перенаправления на другую страницу, кроме входа в метод поведения в Yii 2?

Содержание моего поведения:

public function behaviors()
{
    return [
        'verbs' => [
            'class' => VerbFilter::className(),
            'actions' => [
                'delete' => ['post'],
            ],
        ],
        'access' => [
            'class' => AccessControl::className(),
            'only' => [ 'create','update' ],
            'rules' => [
                [
                    'allow' => true,
                    'actions' => [ 'create'],
                    'roles' => ['@'],
                ],
                [
                    'allow' => true,
                    'actions' => ['logout'],
                    'roles' => ['?'],
                ],
            ],
        ],
    ];
}

Но он перенаправляет логин. Мне нужно указать другую страницу переадресации или позвонить:

throw new \yii\web\HttpException(403, 'The requested Item could not be found.');

Ответы

Ответ 1

Вам нужно изменить свойство loginUrl класса yii\web\User.

Если вы хотите изменить его глобально, отредактируйте свою конфигурацию:

'components' => [
    'user' => [
        'loginUrl' => ['site/sign-in'],  
    ],
],

Если вам нужно изменить его в конкретном контроллере или действии, вы также можете установить его так:

Yii::$app->user->loginUrl = ['site/sign-in'];

Вам нужно переопределить метод beforeAction() в контроллере, где вам нужно это сделать. В этом случае выполняются все chesks доступа.

/**
 * @inheritdoc
 */
public function beforeAction($action)
{
    if (parent::beforeAction($action)) {
        // If you want to change it only in one or few actions, add additional check

        Yii::$app->user->loginUrl = ['site/sign-in'];

        return true;
    } else {
        return false;
    }
}

Подробнее см. официальную документацию о свойства и .

Ответ 2

Вы можете воспользоваться denyCallback(), поскольку официальный документ Yii2 определяет его:

Обратный вызов, который будет вызываться, если доступ должен быть отклонен текущему пользователю. Если он не установлен, будет вызван denyAccess().

Подпись обратного вызова должна быть следующей:

function ($rule, $action)

где $rule - это правило, которое лишает пользователя, а $action - текущий объект действия. $rule может быть нулевым, если доступ запрещен, потому что ни одно из согласованных правил.

В качестве примера:

'denyCallback' => function($rule, $action) {
        if ($something) {
            //set flash for example
            Yii::$app->session->setFlash('key', 'Value');
            //Redirect
            return $action->controller->redirect('action');
        }
        //as a default behavior, it throws an exception
        throw new ForbiddenHttpException("Forbidden access");
 },

Ответ 3

Я использую yii2-user для управления пользователями, а переадресация на логин собиралась /user/login вместо пользователя yii2-user defined/user/security/login. поэтому я решил обновить правила urlManager с помощью: '' = > 'user/security/'

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

Смотрите здесь.