问题
The goal is to do something after authentication success in Symfony2.
In order to do that I have extended AuthenticationSuccessHandlerInterface creating a service for the form login in order to be its success handler.
Here is the firewall in the security.yml file (where the success handler is declared):
firewalls:
main:
pattern: ^/
form_login:
check_path: fos_user_security_check
provider: fos_userbundle
csrf_provider: form.csrf_provider
success_handler: foo_user.component.authentication.handler.login_success_handler
logout: true
anonymous: true
Here is the LoginSuccessHandler service (created in the UserBundle):
namespace Foo\UserBundle\Component\Authentication\Handler;
use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\SecurityContext;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\Router;
class LoginSuccessHandler implements AuthenticationSuccessHandlerInterface
{
protected $router;
protected $security;
public function __construct(Router $router, SecurityContext $security)
{
$this->router = $router;
$this->security = $security;
}
public function onAuthenticationSuccess(Request $request, TokenInterface $token)
{
$referer_url = $request->headers->get('referer');
$response = new RedirectResponse($referer_url);
return $response;
}
}
And here is the services.xml from the UserBundle:
<?xml version="1.0" encoding="utf-8"?>
<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services
http://symfony.com/schema/dic/services/services-1.0.xsd">
<parameters>
<parameter key="foo_user.component.authentication.handler.login_success_handler.class">
Foo\UserBundle\Component\Authentication\Handler\LoginSuccessHandler
</parameter>
</parameters>
<services>
<service id="foo_user.component.authentication.handler.login_success_handler"
class="%foo_user.component.authentication.handler.login_success_handler.class%">
<tag name="monolog.logger" channel="security"/>
<argument type="service" id="router"/>
<argument type="service" id="security.context"/>
<argument type="service" id="service_container"/>
</service>
</services>
</container>
The LoginSuccessHandler constructor is being called and I'm getting no error messages.
The problem I'm having is that onAuthenticationSuccess isn't being called after login success. May be I'm missing something?
回答1:
In my working solutions I implements the method onSecurityInteractiveLogin in my listener as:
public function onSecurityInteractiveLogin(InteractiveLoginEvent $event)
{
$user = $event->getAuthenticationToken()->getUser();
}
Try implementing this method too.
I have your identical configuration (security.yml and service definition) but i don't use fosuserbunde.
hope this help
来源:https://stackoverflow.com/questions/27826964/success-handler-not-working-after-symfony2-login