Symfony3.4集成FOSUserBundle后/login路由无限循环问题排查
解决Symfony 3.4 + FOSUserBundle的登录无限循环问题
你遇到的这个登录循环问题是Symfony安全配置里的典型坑,我来帮你拆解问题根源和解决办法:
问题原因分析
从你的security.yml配置和dev.log日志来看,核心问题出在防火墙的anonymous: false设置上:
当你把main防火墙的匿名访问完全禁用(anonymous: false)时,Symfony不会为任何未认证请求生成匿名令牌。哪怕你在access_control里明确允许/login路径匿名访问,AccessListener在检查请求时还是会因为找不到令牌抛出AuthenticationCredentialsNotFoundException,进而触发认证入口点跳转到登录页;而登录页本身又因为没有匿名令牌再次触发异常,最终导致无限循环。
另外,当你把anonymous: true时全局都能访问,是因为你没有在access_control里添加默认需要登录的规则,所以所有路径都默认允许匿名访问了。
修复方案
调整你的security.yml配置,核心思路是:保留匿名访问开关为true,通过access_control规则精确控制哪些路径允许匿名、哪些需要认证。
修改后的完整security.yml配置如下:
security: encoders: FOS\UserBundle\Model\UserInterface: bcrypt providers: fos_userbundle: id: fos_user.user_provider.username role_hierarchy: ROLE_ADMIN: ROLE_USER firewalls: main: pattern: ^/ form_login: provider: fos_userbundle csrf_token_generator: security.csrf.token_manager logout: true anonymous: true # 开启匿名令牌生成,让access_control规则正常生效 access_control: - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/admin/, role: ROLE_ADMIN } - { path: ^/, role: ROLE_USER } # 最后添加这条,匹配所有未被上面规则覆盖的路径,要求必须登录
配置说明
anonymous: true:让Symfony为未认证用户生成匿名令牌,这样access_control的规则才能正常判断用户权限,不会因为缺少令牌抛出异常。- 新增的
^/规则:放在access_control的最后(规则匹配是从上到下的),确保除了登录、注册、密码重置这些公开路径外,所有其他路径都要求用户必须登录(拥有ROLE_USER权限)。 - 原有规则保留:确保登录、注册、密码重置页面可以被未认证用户正常访问。
这样调整后,你就能实现:
- 未登录用户访问非公开路径时,自动跳转到登录页
- 登录页、注册页等公开路径可以正常访问,不会出现无限循环
- 管理员路径
/admin/仅允许拥有ROLE_ADMIN权限的用户访问
内容的提问来源于stack exchange,提问作者Paolito75
相关产品推荐
相关产品推荐

