Symfony - 如何将用户重定向到登录后访问的最后一个页面?

Posted

技术标签:

【中文标题】Symfony - 如何将用户重定向到登录后访问的最后一个页面?【英文标题】:Symfony - How to redirect the user to last page visited after login? 【发布时间】:2017-07-24 14:58:42 【问题描述】:

如何将用户重定向到使用 fosuserbundle 登录 Symfony 后访问的最后一个页面?

在我的控制器中,我首先检查用户是否登录。如果没有,我将他重定向到登录页面。这是我在控制器开头使用的短代码。

$autenthicated = $this->checkAuth();
if($autenthicated==true)
  return $this->render('MainBundle:Default:home.html.twig');
else
  return $this->redirect($this->generateUrl('login_connect'));

问题是用户登录后,他被重定向到主页而不是最后访问的页面。

我应该如何将他重定向到我的自定义登录页面?显然这不起作用:

return $this->redirect($this->generateUrl('login_connect'));

【问题讨论】:

【参考方案1】:

您不必自己处理重定向到登录路由。

如果您在控制器中抛出AccessDeniedException,安全组件会将您重定向到登录页面(将您尝试访问的页面作为参数)。

登录后,本机 LoginSuccessHandler 会将您重定向到所需的页面。

您也可以使用Controller 快捷方式:

$this->denyAccessUnlessGranted(['ROLE_USER']);// check your needed roles here 

如果您需要在登录后重写重定向逻辑,您可以定义一个服务并告诉安全组件使用该服务来处理重定向。

这是一个虚拟的例子:

您的带有重定向逻辑的 php 服务:AppBundle/Security/LoginSuccessHandler.php

class LoginSuccessHandler implements AuthenticationSuccessHandlerInterface


    // …

    /**
     * @param Request        $request
     * @param TokenInterface $token
     * @return RedirectResponse
     */
    public function onAuthenticationSuccess(Request $request, TokenInterface $token)
    
        // your stuff 
        return new RedirectResponse($this->router->generate(‘custom_route’));
    

服务配置:

# services.yml
app.login_success_handler:
        public: false
        class: AppBundle\Security\LoginSuccessHandler
        arguments: ["@security.token_storage", "@router"]

配置安全组件以使用您的自定义处理程序:

# security.yml 
security:
    firewalls:
        main:
            form_login:
                success_handler: app.login_success_handler

【讨论】:

谢谢,确实这样容易多了

以上是关于Symfony - 如何将用户重定向到登录后访问的最后一个页面?的主要内容,如果未能解决你的问题,请参考以下文章

如果匿名用户无权访问 URL,如何将他们重定向到自定义页面而不是登录页面?

Symfony 登录表单根据用户角色重定向

Symfony2 安全不同的防火墙不能正确重定向到登录

Symfony 安全重定向到登录页面

ELB 后面的 Symfony2 重定向到 http 而不是 https

如果用户已登录,则重定向