在自定义LoginSuccessHandler中重定向到default_target_path?

时间:2012-07-25 21:48:40

标签: symfony

我在成功登录后有基于自定义角色的重定向的自定义成功登录处理程序

当找到$specialRoles数组中的这些特殊角色时,会返回一个新的RedirectResponse

/** @DI\Service("handler.login_sucess_handler") */
class LoginSuccessHandler implements uthenticationSuccessHandlerInterface
{
    private $router;
    private $securityContext;

    /**
     * @DI\InjectParams({
     *     "securityContext"= @DI\Inject("security.context"),
     *     "router"         = @DI\Inject("router") })
     */
    public function __construct(SecurityContext $securityContext,
        I18nRouter $router)
    {
        $this->securityContext = $securityContext;
        $this->router          = $router;
    }

    public function onAuthenticationSuccess(Request $request,
        TokenInterface $token)
    {
        $specialRoles = array('ROLE_1', 'ROLE_2', 'ROLE_3');

        foreach($specialRoles as $specialRole)
        {
            if($this->securityContext->isGranted($specialRole))
            {
                $redirectUrl = $this->router->generate('manage_index');
                return new RedirectResponse($redirectUrl);
            }
        }
    }
}

另一方面,我需要指定如果用户没有特殊角色会发生什么。我想使它更灵活,即:不硬编码默认的/app/dashboard路由。也就是说,从default_target_path文件中读取security.yml(如果有的话):

form_login:
    login_path:          /app/login
    check_path:          /app/login_check
    default_target_path: /app/dashboard
    success_handler:     handler.login_sucess_handler

有没有办法做到这一点?

当然将代码保留为,当用户没有任何特殊角色时,会抛出异常:

  

捕获致命错误:参数1传递给   Symfony的\分量\ HttpKernel \事件\ GetResponseEvent :: setResponse()   必须是Symfony \ Component \ HttpFoundation \ Response的实例,null   给出。

3 个答案:

答案 0 :(得分:2)

这就是我在其中一个项目中的表现:

if ($targetPath = $request->getSession()->get('_security.target_path')) {
    return new RedirectResponse($targetPath);
}

答案 1 :(得分:0)

为什么不在foreach循环后添加带有所需路径的return语句?

    public function onAuthenticationSuccess(
        Request $request, 
        TokenInterface $token
    )
    {
        $specialRoles = array('ROLE_1', 'ROLE_2', 'ROLE_3');

        foreach($specialRoles as $specialRole) {
            if ($this->securityContext->isGranted($specialRole)) {
                $redirectUrl = $this->router->generate('manage_index');
                return new RedirectResponse($redirectUrl);
            } 
        }

        $redirectUrl = $this->router->generate('your_custom_route');
        return new RedirectResponse($redirectUrl);
    }

当然,不要忘记在路由中定义自定义路由。

修改

您还可以在登录表单中设置_referer输入字段并将其与表单一起提交,然后通过$request->get('_referer');

将其付诸实践

另一种方法是尝试从标题中获取引用:$request->headers->get('Referer');

最后,您可以获得默认目标路径,该路径在security.yml中定义:$request->getSession()->get('_security.target_path');

答案 2 :(得分:0)

您是否解决了重定向问题?这些解决方案根本不适合我,但是这个:

return new RedirectResponse($request->headers->get('Referer'));