Spring Security LDAP对接企业AD报bind must be completed on the connection如何解决
问题根因
你遇到的LDAP报错是因为公司Active Directory(AD)默认禁止匿名查询操作,必须先使用有权限的账号完成服务端绑定(bind),才能执行后续的用户查询、认证等操作。你现有配置未配置绑定逻辑,且部分参数不符合AD的对接规则。
配置调整方案
修改后的认证配置如下,完全对齐你提供的PHP可运行逻辑:
@Override public void configure(AuthenticationManagerBuilder auth) throws Exception { auth .ldapAuthentication() // 替换为实际的用户搜索规则,对应PHP中拼接用户名@域的逻辑 .userSearchFilter("(userPrincipalName={0}@aa.company.com)") .userSearchBase("ou=users") .groupSearchBase("ou=users") .contextSource() .url("ldap://companyhost:389/dc=aa,dc=company,dc=com") // 配置AD服务绑定账号,替换为实际有查询权限的服务账号UPN/DN .managerDn("your-service-account@aa.company.com") // 配置绑定账号的密码 .managerPassword("your-service-account-password") // 对应PHP中的LDAP参数配置 .baseEnvironmentProperties(Map.of( "java.naming.ldap.version", "3", "java.naming.referral", "ignore" )); // 移除原有的passwordCompare配置:AD不允许直接读取用户密码属性,改为直接bind验证,和PHP逻辑一致 }
改动说明
- 新增
managerDn、managerPassword配置:用于LDAP连接初始化时完成服务端绑定,获得用户查询权限,解决报错提示的「需先完成bind」问题 - 替换
userDnPatterns为userSearchFilter:AD用户通常分散在多个OU下,通过userPrincipalName直接检索用户更灵活,和PHP中拼接用户名@域的逻辑对齐 - 移除
passwordCompare相关配置:改为Spring Security LDAP默认的bind认证模式,直接使用用户输入的账号密码向AD发起绑定请求,绑定成功即认证通过,符合AD的标准认证逻辑 - 新增LDAP基础参数配置:匹配PHP代码中的协议版本、关闭referrals的配置,避免AD连接兼容性问题
内容的提问来源于stack exchange,提问作者Safari
相关产品推荐
相关产品推荐

