【问题标题】:Get Url from which the Redirection has been made获取进行重定向的 URL
【发布时间】:2020-08-24 21:54:17
【问题描述】:

我正在使用带有 FOS 用户包的 symfony 框架。

我的网站上有一个 URL https://my-domain/article/view/articleId 来显示文章的内容。对于这个 url,我对 ArticleVoter 进行了安全检查,如果用户未登录,则会引发 AccessDenied 异常。

(你可能会问自己“为什么我不把 url 放在主防火墙后面?”。因为对于某些文章,未登录用户可以访问 url,这取决于我的某些属性文章实体,这是 ArticleVoter 进来的时候,为了检查这些属性)。

然后我有一个实现 EventSubscriberInterface 的 AccessDeniedSubscriber,它是这样的(为了清楚起见,简化版本):

public function onKernelException(GetResponseForExceptionEvent $event): void
{
    $exception = $event->getException();

    if ($exception instanceof AccessDeniedException && !self::isThrownByFirewall($exception)) {
        $redirectRoute = 'my_login';

        // Create your own response like in a custom access denied handler
        $response = new RedirectResponse($this->router->generate($redirectRoute));
        $event->setResponse($response);
        $event->stopPropagation();
    }
}

public static function getSubscribedEvents()
{
    return [
        // Define the priority to execute our subscriber before the one from the security component
        KernelEvents::EXCEPTION => ['onKernelException', 1],
    ];
}

所以发生的情况是匿名(未连接)用户尝试访问 url https://my-domain/article/view/articleId,ArticleVoter 抛出 AccessDeniedExpetion,其投票方法将返回访问被拒绝,然后用户被重定向到 my_login 路由。

在我的登录路由上,我试图确定用户最初是从哪个路由重定向的。登录路由的关联控制器方法如下所示:

public function loginAction(Request $request, AuthenticationUtils $authenticationUtils)
{
     $referer = $request->headers->get('referer');

     ... handle login rendering ...
}

不幸的是,referer 始终为空。我确实理解,因为它是服务器端重定向,而不是通过单击链接或 javascript 进行的重定向。

所以我的问题是,如何在被重定向到登录页面之前获取用户尝试访问的初始 url? 在我的情况下,那将是 https://my-domain/article/view/articleId 具有正确的文章 ID。

精度:要回复@RyanNerd的答案,请在下面找到 var_dump($request->headers) 的结果:

object(Symfony\Component\HttpFoundation\HeaderBag)#73 (2) { ["headers":protected]=> array(13) { ["host"]=> array(1) { [0]=> string(9) "localhost" } ["connection"]=> array(1) { [0]=> string(10) "keep-alive" } ["upgrade-insecure-requests"]=> array(1) { [0]=> string(1) "1" } ["user-agent"]=> array(1) { [0]=> string(121) "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36" } ["accept"]=> array(1) { [0]=> string(124) "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9" } ["sec-fetch-site"]=> array(1) { [0]=> string(4) "none" } ["sec-fetch-mode"]=> array(1) { [0]=> string(8) "navigate" } ["sec-fetch-user"]=> array(1) { [0]=> string(2) "?1" } ["sec-fetch-dest"]=> array(1) { [0]=> string(8) "document" } ["accept-encoding"]=> array(1) { [0]=> string(17) "gzip, deflate, br" } ["accept-language"]=> array(1) { [0]=> string(23) "fr,en-US;q=0.9,en;q=0.8" } ["cookie"]=> array(1) { [0]=> string(561) “MY_SESSION_NAME_SESS=qih0m4nlmi5enljsni5lphkf9m; sf_redirect=%7B%22token%22%3A%22821c13%22%2C%22route%22%3A%22article_view%22%2C%22method%22%3A%22GET%22%2C%22controller%22%3A%7B%22class%22%3A%22AllArticle%5C%5CWebBundle%5C%5CController%5C%5CArticle%5C%5CArticleController%22%2C%22method%22%3A%22viewAction%22%2C%22file%22%3A%22%5C%2FUsers%5C%2Fjohn_fly%5C%2FallArticle%5C%2Fsrc%5C%2FAllArticle%5C%2FWebBundle%5C%2FController%5C%2FArticle%5C%2FArticleController.php%22%2C%22line%22%3A244%7D%2C%22status_code%22%3A302%2C%22status_text%22%3A%22Found%22%7D" } ["x-php-ob-level"]=> array(1) { [0]=> string(1) "1" } } ["cacheControl":protected]=> array(0) { } }

如您所见,在 'cookie' 值中,提到了 'sf_redirect',也许有某种方法可以检索上一个 URL,因为上一个路由写在这个字符串中 ("%22article_view%" ) ?

【问题讨论】:

  • 异常编程是一条黑暗而危险的道路。话虽如此,var_dump($request->headers) 看起来像什么?是否有任何其他标题被返回?这可能会为“referer”为何为空提供线索。
  • 感谢@RyanNerd 的回复,我将 var_dump 的结果添加到我的问题中

标签: php symfony redirect http-referer referer


【解决方案1】:

当你重定向到登录页面时,添加一个 GET 参数redirectfrom 以页面 URL 作为值,以便登录成功后你可以重定向到该 URL。

【讨论】:

    猜你喜欢
    • 2011-06-24
    • 2013-09-07
    • 2019-10-30
    • 1970-01-01
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多