首页 文章

symfony2如何在登录后重定向到请求的页面

提问于
浏览
19

假设我的路由 /booking/(.*)security.yml 中的防火墙配置保护,它需要“ ROLE_USER ", when user tries to access any route that is preceded by " /booking/ ”该应用程序将用户重定向到登录页面进行身份验证 .

所以我的问题是,在用户提供他的凭据并获得身份验证之后,Symfony 2如何能够将用户重定向回用户请求的页面/路由或者Symfony 2存储在哪里 route 它将它存储在某个会话中别的地方 .

Can we access it and how?

4 回答

  • 11

    我也有这个问题 . 我使用了security.yml并在使用的注册操作中:

    $redirectUrl = $request->getSession()->get('_security.account.target_path');
    

    请享用 .

  • 27

    Symfony使用HTTP Referer header将用户重定向回他们来自的页面..即引用者

    您可以使用security.yml中的安全配置 use_referer: true 进行设置,details here

    您可以使用以下命令从控制器访问referer标头:

    $referer = $request->headers->get('referer');
    

    Note Headers 拼写错误,其引用(一个r)

  • 3

    Carrie Kendall的解决方案有效,谢谢!

    这是Symfony中的完整实现:

    services.yml:

    login_handler:
        class: Project\BaseBundle\Service\loginHandler
        arguments: ['@router', '@doctrine.orm.entity_manager', '@service_container']
    

    在Project \ BaseBundle \ Service \ loginHandler中:

    namespace Project\BaseBundle\Service;
    
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpFoundation\RedirectResponse;
    use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
    use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface;
    use Symfony\Component\Routing\RouterInterface;
    use Doctrine\ORM\EntityManager;
    
    
    class loginHandler implements AuthenticationSuccessHandlerInterface {
    
        private $router;
        private $container;
        private static $key;
    
        public function __construct(RouterInterface $router, EntityManager $em, $container) {
    
            self::$key = '_security.secured_area.target_path';
    
            $this->router = $router;
            $this->em = $em;
            $this->session = $container->get('session');
    
        }
    
        public function onAuthenticationSuccess( Request $request, TokenInterface $token ) {
    
            $user_entity = $token->getUser();
    
            if( !$user_entity->getChangePassword() ) {
    
                $route = $this->router->generate('BaseBundle_home_page');
    
            } else {
    
                $this->session->getFlashBag()->add('error', 'Your password must be changed now');
    
                $route = $this->router->generate('BaseBundle_account_page');
    
            }
    
            //check if the referer session key has been set
            if ($this->session->has( self::$key )) {
    
                //set the url based on the link they were trying to access before being authenticated
                $route = $this->session->get( self::$key );
    
                //remove the session key
                $this->session->remove( self::$key );
                //if the referer key was never set, redirect to a default route
    
            } else{
    
                $url = $this->generateUrl('BaseBundle_home_page');
    
                return new RedirectResponse($route);
    
            }
    
            return new RedirectResponse($route);
    
        }
    }
    
  • 4

    这是可能的,您可以在会话中访问引用链接(如果 use_referer 设置为 true ,则使用该链接) .

    例如,如果您的 form_login (在防火墙配置中)有一个 success_handler 服务,它根据某些条件(通常是角色)重定向用户,但是如果设置了用户,则您希望将用户重定向到引荐来源链接,您可以访问引荐来源链接像这样:

    $key = '_security.main.target_path'; #where "main" is your firewall name
    
    //check if the referrer session key has been set 
    if ($this->container->get('session')->has($key)) {
        //set the url based on the link they were trying to access before being authenticated
        $url = $this->container->get('session')->get($key);
    
        //remove the session key
        $this->container->get('session')->remove($key);
    }
    //if the referrer key was never set, redirect to a default route
    else{
        $url = $this->router->generate('member_home');
    }
    
    return new RedirectResponse($url);
    

    使用标头获取引用者(即 $request->headers->get('referer') )在这种情况下不起作用,因为它将始终返回登录链接 .

    感谢Roman Marintsenko和Ryan Weaver为此blog

相关问题