在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.');
答案 0 :(得分:19)
您需要更改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;
}
}
的官方文档
答案 1 :(得分:9)
您可以从 denyCallback() 中受益,因为Yii2
的官方文档定义了它:
如果应拒绝当前用户访问,将调用的回调。如果未设置,将调用 denyAccess ()。
回调的签名应如下:
function ($rule, $action)
其中$rule
是拒绝用户的规则,$action
是当前操作对象。如果访问被拒绝,则$rule
可以为null,因为没有规则匹配。
举个例子:
'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");
},
答案 2 :(得分:1)
我正在使用yii2-user进行用户管理,登录的重定向是/ user / login而不是yii2-user defined / user / security / login。所以我的修复是使用以下命令更新urlManager规则:''=> '用户/安全/'
我想这也可以用来重定向到登录以外的其他控制器/动作。
请参阅here。