我有一个自定义成功登录处理程序,用于在成功登录后自定义基于角色的重定向。
$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。