在auth之后将用户重定向到上一页(yii2)

时间:2014-06-07 19:01:19

标签: yii2

我有继承其他人的主控制器。代码是这样的

public function init()
{
    $this->on('beforeAction', function ($event) {
        ...

        if (Yii::$app->getUser()->isGuest) {
            $request = Yii::$app->getRequest();
            // dont remember login page or ajax-request
            if (!($request->getIsAjax() || strpos($request->getUrl(), 'login') !== false))                  {
               Yii::$app->getUser()->setReturnUrl($request->getUrl());
              }
           }
        }
        ...
    });
}

除了带有验证码的页面外,它适用于所有页面。所有带验证码的页面都被重定向到这样的东西 - / captcha /?v = xxxxxxxxxxxxxx

如果对象被记录Yii :: $ app-> getRequest(),那么我看到对于带有验证码的页面,它会被使用两次。第一次对象是corect,第二次我用captcha看到对象。 如何用yii解决这个问题?有机会不跟踪验证码的请求吗?

2 个答案:

答案 0 :(得分:1)

默认(生成)控制器使用如下内容:

public function actions()
{
    return [
        'captcha' => [
            'class' => 'yii\captcha\CaptchaAction',
        ],
    ];
}

你的控制器是否包含这样的东西?

这意味着有一个动作"验证码"用于显示验证码(它返回图像)。当您有一个显示验证码的页面时,将在您要返回的页面之后调用该图像。因此,访问的最新页面是具有验证码的页面。

我认为你必须过滤掉这个动作。

另一种可能是使用默认的$controller->goBack()方法。我认为这会默认处理returnUrl的注册。

参考:Class yii\web\Controller

答案 1 :(得分:0)

Guid security authorization

在控制器中使用访问控制过滤器(ACF)。

use yii\web\Controller;
use yii\filters\AccessControl;

class SiteController extends Controller
{
    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'only' => ['login', 'logout', 'signup'],
                'rules' => [
                    [
                        'allow' => true,
                        'actions' => ['login', 'signup'],
                        'roles' => ['?'],
                    ],
                    [
                        'allow' => true,
                        'actions' => ['logout'],
                        'roles' => ['@'],
                    ],
                ],
            ],
        ];
    }
    // ...
}