Мне нужно запустить код до проверки правильности учетных данных пользователя. В настоящее время я достигаю этого с помощью специального прослушивателя событий, который запускает событие 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
и т. Д.).