重定向到Yii 2行为中登录以外的页面

时间:2014-12-10 18:16:19

标签: yii2

在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.');

3 个答案:

答案 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;
    }
}

有关详细信息,请查看有关propertyevent

的官方文档

答案 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