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

Yii2 重定向到Yii 2中登录以外的页面,yii2,Yii2,除了Yii 2中的登录行为方法外,是否有其他方法重定向到其他页面 我的行为方法内容: public function behaviors() { return [ 'verbs' => [ 'class' => VerbFilter::className(), 'actions' => [ 'delete' => ['post'], ],

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

您需要更改
yii\web\User
类的
loginUrl
属性

如果要全局更改,请编辑配置:

'components' => [
    'user' => [
        'loginUrl' => ['site/sign-in'],  
    ],
],
如果需要在特定控制器或操作中进行更改,也可以如下设置:

Yii::$app->user->loginUrl = ['site/sign-in'];
您需要重写控制器中需要执行此操作的
beforeAction()
方法。在此事件中执行所有访问检查

/**
 * @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;
    }
}

有关详细信息,请查看和的官方文档。

您可以从中获益,因为
Yii2
的官方文档定义了它:

如果拒绝当前用户访问,将调用该回调。如果未设置,将调用denyAccess()

回调的签名应如下所示:

function ($rule, $action)
其中,
$rule
是拒绝用户的规则,
$action
是当前操作对象<如果由于没有匹配的规则而拒绝访问,则code>$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");
 },

我使用yii2user进行用户管理,重定向到login的是/user/login,而不是yii2user-defined/user/security/login。因此,我的修复方法是使用:“”=>“user/security/”更新urlManager规则

我想这也可以用来重定向到登录以外的其他控制器/操作


请参阅。

在行为中的访问控制功能中是否有实现此功能的方法?检查了源代码,我认为这是不可能的。请参阅更新的答案。因此,如果访问被拒绝,我无法调用403或404异常?对于这种行为,不应手动执行。如果拒绝访问当前操作,则有两种可能的情况。如果用户是来宾,他将被重定向到loginUrl。否则将抛出403异常。这两种情况都是自动处理的。我的意思是没有办法通过行为参数来更改loginUrl。我把这个问题理解为更改loginUrl。如果您需要反转逻辑来抛出异常和重定向,是的,可以使用此闭包。它不显示403错误,我使用了类似“denyCallback”=>函数($rule,$action){If(Yii::$app->user->isGuest){throw new\Yii\web\HttpException(403,'无法找到请求的项');}}亲爱的@user7282,这是更改拒绝访问默认行为的规范方法。我在答案上写的只是一个例子。您可以自定义
denyCallback()
,以便在拒绝访问时执行所需操作。例如,抛出到
HttpException
或重定向或添加日志或任何东西。是的,这就是我尝试的,仍然没有显示403错误['actions'=>update'],'allow'=>true,'denyCallback'=>函数($rule,$action){if(Yii::$app->user->isGuest){抛出新的\yii\web\HttpException(403,“找不到请求的项”);}],@user7282亲爱的,如果访问被拒绝,将调用此函数。您不需要通过if语句检查它。如果上述链接未解析,请改用。