Symfony 5.2同一防火墙配置form_login与form_login_ldap双认证失效问题
问题根源
你遇到的冲突是Symfony 5.2+ 新认证器系统的默认规则导致的:只要任一认证器生成了响应(比如认证失败后的重定向响应),就会直接终止后续认证器的执行。
从日志可以看出,FormLoginAuthenticator的执行顺序排在LdapAuthenticator之前,你提交LDAP登录请求时,它优先读取到请求中的用户名、密码参数尝试本地用户认证,失败后生成了重定向响应,直接中断了LDAP认证逻辑的执行。
解决方案
你只需要补充以下三处配置即可解决问题:
1. 配置默认认证入口点
在main防火墙下新增entry_point配置,指定未登录时默认跳转的登录页,避免两个认证器的入口冲突:
firewalls: main: lazy: true provider: chain_user_provider # 新增配置:默认跳转普通登录页填form_login,默认跳转LDAP登录页填form_login_ldap entry_point: form_login
2. 开启认证失败继续执行逻辑
给form_login配置新增continue_on_failure: true,让本地表单认证失败后不直接返回响应,继续执行后续的LDAP认证逻辑:
form_login: login_path: security_login check_path: security_login # 新增配置 continue_on_failure: true # 可选补充:明确指定认证失败后跳转到普通登录页,避免跳转错误 failure_path: security_login
如果你需要实现LDAP认证失败后自动 fallback 到本地认证,也可以给form_login_ldap同样加上continue_on_failure: true配置即可。
3. (可选推荐)配置独立的请求参数
为了避免两个登录表单的参数冲突,建议给两种认证方式配置不同的用户名/密码参数名,同步修改对应登录表单的input的name属性即可:
form_login_ldap: # 原有其他配置保持不变 username_parameter: ldap_username password_parameter: ldap_password form_login: # 原有其他配置保持不变 username_parameter: local_username password_parameter: local_password
修改完成后执行php bin/console cache:clear重启Symfony缓存即可生效。
内容的提问来源于stack exchange,提问作者Serge P
相关产品推荐
相关产品推荐

