我在成功登录后有基于自定义角色的重定向的自定义成功登录处理程序。
当找到$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 给出。
答案 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'));