问题
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