Перенаправление на страницу, отличную от входа в систему 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/'
Я предполагаю, что это может быть использовано также для перенаправления на другой контроллер/действие, отличное от входа.
Смотрите здесь.