Symfony 5.3中AuthenticationEvents认证失败事件订阅者未触发
问题原因
你遇到的问题是监听的事件标识和方法接收的事件类型不匹配,分两种场景对应不同根因:
- 如果你使用的是Symfony 5.2及更早的传统安全系统:
AuthenticationEvents::AUTHENTICATION_FAILURE对应传递的事件对象是Symfony\Component\Security\Core\Event\AuthenticationFailureEvent,你的方法类型声明用了Http层的LoginFailureEvent,类型不匹配导致回调无法被触发。 - 如果你使用的是Symfony 5.3+的新认证器系统(Symfony 6+默认开启,
security.yaml中enable_authenticator_manager: true):AuthenticationEvents::AUTHENTICATION_FAILURE已经被废弃,新的登录失败/成功事件直接以LoginFailureEvent::class、LoginSuccessEvent::class作为事件标识,原来的AuthenticationEvents下的常量对应事件不会在新认证流程中触发。
修复方案
方案1:适配传统安全系统
修改订阅者的导入类和方法参数类型:
// 替换顶部导入 use Symfony\Component\Security\Core\Event\AuthenticationFailureEvent; use Symfony\Component\Security\Core\Event\AuthenticationSuccessEvent; // 修改对应方法的参数类型 public function securityauthenticationfailure(AuthenticationFailureEvent $event){ dump($event); } public function securityauthenticationsuccess(AuthenticationSuccessEvent $event){ dump($event); }
方案2:适配新认证器系统(推荐)
直接修改getSubscribedEvents方法中的事件标识:
public static function getSubscribedEvents() { return [ LoginSuccessEvent::class => 'securityauthenticationsuccess', LoginFailureEvent::class => 'securityauthenticationfailure', KernelEvents::REQUEST => 'KernelRequest', ]; }
验证排查方法
修改完成后执行php bin/console cache:clear清空缓存,可执行以下命令确认订阅者是否注册成功:
# 传统系统对应命令 php bin/console debug:event-dispatcher authentication.failure # 新系统对应命令 php bin/console debug:event-dispatcher "Symfony\Component\Security\Http\Event\LoginFailureEvent"
如果输出中能看到你的订阅者方法,说明注册正常,再次测试登录即可看到dump输出。
内容的提问来源于stack exchange,提问作者Zip120
相关产品推荐
相关产品推荐

