Symfony 5.3集成Firebase JWT Token校验不生效问题求助
问题原因与解决方案
你当前遇到的配置不生效问题由以下几处错误导致,按优先级修改即可:
1. 未配置访问控制规则
你配置文件中的access_control段完全处于注释状态,Symfony没有规则判断哪些路径需要授权、哪些可以公开访问,默认会放行所有请求。
修改security.yaml的access_control段,放开登录接口的访问权限,其余路径强制要求认证:
access_control: - { path: ^/authenticate, roles: PUBLIC_ACCESS } - { path: ^/, roles: ROLE_USER }
2. 防火墙未绑定认证入口点
当前你的JWT认证器的supports方法仅在请求携带Authorization头时才会触发认证逻辑,未携带头的请求会被直接放过。需要在main防火墙下指定认证入口点,未通过认证的请求会自动调用认证器的start方法返回401:
main: lazy: true provider: app_user_provider stateless: true entry_point: App\Security\JwtAuthenticator # 新增这行指定入口点 guard: authenticators: - App\Security\JwtAuthenticator
3. 用户提供者配置错误
你当前main防火墙绑定的是users_in_memory空内存用户提供者,但实际业务中是从数据库查询ATblUsers实体,需要先配置正确的数据库用户提供者:
providers: app_user_provider: # 新增自定义数据库用户提供者 entity: class: App\Entity\ATblUsers property: id
同时将main防火墙下的provider参数修改为app_user_provider,删除无用的users_in_memory配置即可。
另外Symfony5已经废弃encoders配置段,你可以将ATblUsers的密码哈希配置移到password_hashers下:
password_hashers: Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: 'auto' App\Entity\ATblUsers: algorithm: bcrypt
4. 认证器checkCredentials方法为空
JWT认证场景下,你已经在getUser阶段完成了JWT有效性校验,只要查询到对应存在的用户即可认为凭证有效,需要给该方法返回true:
public function checkCredentials($credentials, UserInterface $user) { return true; }
可选优化
你当前开启了enable_authenticator_manager(Symfony5+的新认证体系),但仍在使用已废弃的Guard组件写法,后续可以将JwtAuthenticator改为实现Symfony\Component\Security\Http\Authenticator\AuthenticatorInterface接口适配新体系,避免后续版本升级出现兼容问题。
内容的提问来源于stack exchange,提问作者FourBars

