我有一个登录 success_handler,它将一些用户重定向到一个特殊的表单。 不管怎样,AuthenticationSuccessHandlerInterface 需要返回一个 Response 并且工作正常,除了一种情况。如果用户第一次填写错误的凭据并再次被重定向到登录页面,处理程序将在正确登录后再次将他重定向到登录页面。
如果我简单地使用选项 use_referer: true 它工作正常。所以我可以将逻辑而不是事件放在 Controller 中,但也许你们中的某些人可以为我提供解决方案。
谢谢
防火墙
firewalls:
main:
pattern: ^/
form_login:
provider: fos_userbundle
csrf_provider: form.csrf_provider
success_handler: applypie_userbundle.login.handler
#default_target_path: applypie_user_dashboard
use_referer: true
logout: true
anonymous: true
事件
namespace Applypie\Bundle\UserBundle\EventListener;
use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\HttpFoundation\Request;
class NewUserListener implements AuthenticationSuccessHandlerInterface
{
protected $router;
public function __construct(RouterInterface $router)
{
$this->router = $router;
}
public function onAuthenticationSuccess(Request $request, TokenInterface $token)
{
$user = $token->getUser();
if(!$user->getApplicant() && !count($user->getCompanies())) {
return new RedirectResponse($this->router->generate('applypie_user_applicant_create'));
}
return new RedirectResponse($request->headers->get('referer'));
}
}
服务
applypie_userbundle.login.handler:
class: Applypie\Bundle\UserBundle\EventListener\NewUserListener
arguments: ["@router"]
最佳答案
我很高兴看到您已经完成了重定向工作。
您不需要 use_referer
因为它将是登录页面 URI(因为它是浏览器在 header 中发送的真实引用),只需采用用户尝试访问的 URI来自 session :
return new RedirectResponse($request->getSession()->get('_security.main.target_path'));
这里有更多相关信息:
http://symfony.com/doc/current/cookbook/security/target_path.html
如果您处于开发模式 (app_dev.php),您会发现很多重要信息,例如每个请求的 session 值,请查看开发工具栏。
关于symfony - AuthenticationSuccessHandlerInterface 和正确的重定向策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19008842/