В настоящее время я работаю над пользовательской логикой подражать слушателю.
я переопределил Symfony \ Component \ Security \ Http \ Firewall \ SwitchUserListener, потому что я хотел бы выполнить вызов некоторых репозиториев объектов (не объекта User) перед авторизацией события переключения:
например, я хотел бы авторизовать коммутатор в том и только в том случае, если пользователь для олицетворения уже дал права пользователю, запрашивающему коммутатор.
Можно ли ввести новые параметры, такие как Doctrine Service или некоторые значения массивов, переопределенному слушателю?
вызов моего пользовательского SwitchUserListenener:
in services.yml
parameters:
security.authentication.switchuser_listener.class: acme\appBundle\EventListener\SwitchUserListener
Ваше решение может быть здесь:
https://github.com/symfony/symfony/blob/2.6/src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php#L597
Сервис security.authentication.switchuser_listener
определяется Symfony является абстрактным сервисом. На самом деле это не служба, используемая в качестве прослушивателя, а тот же класс.
Поднимитесь в коде немного, чтобы:
https://github.com/symfony/symfony/blob/2.6/src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php#L233
foreach ($firewalls as $name => $firewall) {
list($matcher, $listeners, $exceptionListener) = $this->createFirewall($container, $name, $firewall, $authenticationProviders, $providerIds);
Это имя созданного вами брандмауэра, на котором будет возможно переключение пользователя.
Теперь у вас есть несколько вариантов переопределить слушателя.
Вы можете продолжать переопределять параметр класса, а затем манипулировать аргументами, как это делает Symfony:
$listener->replaceArgument(1, new Reference($userProvider));
$listener->replaceArgument(3, $id);
$listener->replaceArgument(6, $config['parameter']);
$listener->replaceArgument(7, $config['role']);
Или, проще, скомпилируйте дополнительные вызовы методов в вашем расширении.
Другое решение, было бы создать CompilerPass
который систематически удаляет исходных слушателей и заменяет их собственными. Это может быть достигнуто в вашем собственном расширении связок, если оно загружено после SecurityBundle
,
$container->removeDefinition($id);
РЕДАКТИРОВАТЬ:
Другое решение, возможно, более простое, чем приведенное выше, заключается в создании другого прослушивателя событий.
Тот, который срабатывает по запросу. Здесь важно то, что слушатель должен иметь более высокий приоритет по отношению к слушателям, которых вы переопределяете (я использовал слушателей, потому что у вас может быть несколько переключателей).
Сложнее будет получить список переопределенных идентификаторов слушателей, потому что вам нужно будет зациклить их и вызывать свои собственные методы для внедрения новых зависимостей после создания экземпляров слушателей, но до их срабатывания.
Других решений пока нет …