Symfony 6.3中Authenticator的supports()函数单次请求被调用两次的原因
以下是Symfony 6.3环境下,导致该问题的常见原因:
多防火墙匹配同一请求
检查config/packages/security.yaml中的防火墙配置,若多个防火墙的pattern规则同时匹配当前请求路径,每个匹配的防火墙都会触发认证流程,进而调用supports()方法。例如同时配置了覆盖根路径的main防火墙和匹配/api路径的api防火墙,/api开头的请求会被两个防火墙同时处理。内核事件重复订阅
认证逻辑默认绑定kernel.request事件,若自定义代码或第三方Bundle重复订阅了该事件并触发认证流程,会导致supports()被多次调用。可排查项目中的自定义EventSubscriber或Listener,确认是否存在重复处理kernel.request的情况。开发环境Profiler的影响
Symfony调试工具栏(Profiler)在开发环境下,可能为收集请求数据发起内部子请求,或重复触发部分事件流程,导致supports()被额外调用一次。可临时关闭调试模式(设置APP_DEBUG=0)后测试,验证是否由Profiler导致。内部转发或重定向
若请求触发了内部路由转发(如控制器中使用forward()方法)或重定向(如HTTP转HTTPS),Symfony会分别处理原始请求和转发/重定向后的请求,两次流程都会触发认证,导致supports()被调用两次。可查看请求日志确认是否存在此类操作。Authenticator重复注册
检查security.yaml中防火墙的custom_authenticators列表,是否同一Authenticator被多次添加;同时排查services.yaml,确认是否重复定义了该Authenticator的服务。重复注册会导致认证流程被多次触发。
排查建议
- 查看
var/log/dev.log中的kernel.request事件记录,对比两次调用的上下文信息(如所属防火墙、请求ID); - 在supports()方法中添加
dump($request->attributes->get('_firewall_context')),确认两次调用是否对应不同的防火墙上下文。
内容的提问来源于stack exchange,提问作者Denis Valdenaire aka Joe Linux

