我有一个使用 SSO 和 FosUserBundle 的 Symfony2 应用程序。但是,有一个 FosUserBundle 事件侦听器在用户登录时触发,因此会阻止我的 SSO 捆绑包工作。
我有没有办法app/config/config.yml
可以轻松禁用这个特定的 FosUserBundle 侦听器?
PS。听众是FOS\UserBundle\EventListener\LastLoginListener::onSecurityInteractiveLogin
我有一个使用 SSO 和 FosUserBundle 的 Symfony2 应用程序。但是,有一个 FosUserBundle 事件侦听器在用户登录时触发,因此会阻止我的 SSO 捆绑包工作。
我有没有办法app/config/config.yml
可以轻松禁用这个特定的 FosUserBundle 侦听器?
PS。听众是FOS\UserBundle\EventListener\LastLoginListener::onSecurityInteractiveLogin
您可以替换服务定义并使用具有相同接口但不执行任何操作的存根类。
services:
acme.menu.adaptor:
class: MyProject\Helper\NullMenuAdapter
tags:
- { name: 'acme.menu.adaptor' }
如果服务依赖于标签,有时您可以删除标签:
services:
acme.menu.adaptor:
class: Acme\Helper\RealMenuAdapter
# tags:
# - { name: 'acme.menu.adaptor' }
浏览 EventDispatcher 代码,我看不到任何简单的方法来禁用 config.yml 中的特定侦听器。
您可以做的一件事是使用您自己的类扩展 LastLoginListener,将参数fos_user.security.interactive_login_listener.class
(参见https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/config/security.xml)设置为您的扩展类,然后getSubscribedEvents()
用类似下面的东西覆盖:
public static function getSubscribedEvents()
{
return array(
FOSUserEvents::SECURITY_IMPLICIT_LOGIN => 'onImplicitLogin',
);
}
SecurityEvents::INTERACTIVE_LOGIN
因此删除了对该事件的订阅。
不确定这是否是最干净的方法,但它可能是需要最少代码行的方法。
编辑:
为了进一步详细说明我的答案,我认为无法通过配置文件禁用特定侦听器方法的原因是 LastLoginListener 使用 kernel.event_subscriber 标记来指示它正在侦听自定义事件。
该类使用 kernel.event_subscriber 标记在每个服务上Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\RegisterKernelListenersPass
调用该getSubscribedEvents()
方法,然后为所有返回的类 + 回调添加事件订阅。
在设置它的代码中似乎没有任何覆盖。
但是,我将所有这些都建立在查看代码的基础上,因此我可能错过了某个选项。
我想说的是捆绑包的责任是提供配置以禁用其某些行为。
因此,如果不是这种情况,请进行更改(默认启用事件侦听器)并发送 PR :)
这是通过配置启用/禁用的一些示例:https ://github.com/KnpLabs/KnpRadBundle/blob/develop/DependencyInjection/KnpRadExtension.php#L27-L57
使用相应的配置: https ://github.com/KnpLabs/KnpRadBundle/blob/develop/DependencyInjection/Configuration.php#L32-L38
就我而言,在 Symfony 5 中,我需要覆盖一些供应商服务。为此目的alias
为我工作。所以在 services.yaml 中你可以定义:
Ekino\NewRelicBundle\Listener\ExceptionListener:
alias: App\Service\NewRelic\ExceptionListener
Ekino\NewRelicBundle\Listener\ExceptionListener
是我要覆盖的服务 ID。您可以通过运行找到服务 ID:
php bin/console debug:container