3

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

$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

有没有办法做到这一点?

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

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

4

3 回答 3

2

这就是我在我的一个项目中的做法:

if ($targetPath = $request->getSession()->get('_security.target_path')) {
    return new RedirectResponse($targetPath);
}
于 2012-07-26T07:49:54.827 回答
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');

于 2012-07-26T05:50:21.690 回答
0

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

return new RedirectResponse($request->headers->get('Referer'));
于 2012-11-16T00:14:10.927 回答