Мне нужно запустить код до проверки правильности учетных данных пользователя. В настоящее время я достигаю этого с помощью специального прослушивателя событий, который запускает событие kernel.request и проверяет, соответствует ли запрошенный URL- check_path параметру check_path . Но это неэффективно, поскольку оно выполняется по каждому запросу. Я знаю событие onSecurityInteractiveLogin , но я считаю, что он срабатывает после успешной попытки входа в систему. Кто-нибудь знает, есть ли предварительное событие входа в систему или где я могу отправить собственное событие самостоятельно?
Таким образом, не существует «официального» события предварительного входа. Но, к счастью, это не сложно, так как Symfony2 настолько расширяем. Хитрость заключается в использовании вашего собственного сервиса для проверки подлинности.
Symfony использует этот класс при использовании формы входа:
Symfony\Component\Security\Http\Firewall\UsernamePasswordFormAuthenticationListener
Если вы переопределите параметр security.authentication.listener.form.class (первоначально определенный в Symfony\Bundle\SecurityBundle\Resources\config\security_listeners.xml ), вы можете использовать пользовательский прослушиватель, который расширяет UsernamePasswordFormAuthenticationListener .
Все, что осталось сделать, это переопределить метод attemptAuthentication() для отправки настраиваемого события.
(На самом деле вам также необходимо сохранить диспетчер событий как свойство класса в __construct() )
Этот метод должен работать с другими методами проверки подлинности – все, что вам нужно сделать, это изменить соответствующий прослушиватель (например, BasicAuthenticationListener , X509AuthenticationListener и т. Д.).