Обработчик успеха не работает после входа в Symfony2


Цель состоит в том, чтобы что-то сделать после успешной аутентификации в Symfony2.

Для этого я расширил AuthenticationSuccessHandlerInterface создание службы для входа в форму, чтобы быть ее обработчиком успеха.

Вот брандмауэр в системе безопасности.файл yml (где объявлен обработчик успеха):

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 

Вот сервис LoginSuccessHandler (созданный в 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;
    }
}

И вот services.xml из списка пользователей:

<?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>

Конструктор LoginSuccessHandler находится в позвонил, и я не получаю сообщений об ошибках.

Проблема, с которой я сталкиваюсь, заключается в том, что onAuthenticationSuccess не вызывается после успешного входа в систему. Может быть, я что-то упускаю?

Author: rfc1484, 2015-01-07

1 answers

В своих рабочих решениях я реализую метод onsecurityinteractivelogin в моем слушателе как:

public function onSecurityInteractiveLogin(InteractiveLoginEvent $event) 
    {
        $user = $event->getAuthenticationToken()->getUser();
    }

Попробуйте также реализовать этот метод.

У меня есть ваша идентичная конфигурация (security.yml и определение службы), но я не использую fosuserbunde.

Надеюсь, это поможет

 2
Author: Matteo, 2015-01-08 05:47:09