Spring Boot集成LDAP时,如何配置使用sAMAccountName作为登录用户名
Spring Boot集成LDAP时,如何配置使用sAMAccountName作为登录用户名
嗨,我之前在项目里刚好解决过一模一样的需求,其实核心就是调整Spring Boot LDAP认证时的用户匹配规则,把原来用CN(全名)匹配改成用sAMAccountName匹配就行,我给你一步步说清楚怎么改:
首先,你现在的问题是输入"John, Doe"能登录,说明系统是通过CN去匹配用户名的,现在要换成sAMAccountName(也就是你的john-do),重点要修改LdapAuthenticator这个Bean的配置,让它用sAMAccountName={0}作为搜索过滤器,这里的{0}就是用户登录时输入的用户名。
具体代码调整
你原来的LdapAuthenticator Bean可以改成这样:
@Bean public LdapAuthenticator ldapAuthenticator(BaseLdapPathContextSource contextSource) { BindAuthenticator authenticator = new BindAuthenticator(contextSource); // 配置用户搜索规则:基于sAMAccountName匹配登录输入的用户名 // 第一个参数是空字符串,会继承你在application.properties里配置的spring.ldap.base作为搜索根路径 FilterBasedLdapUserSearch userSearch = new FilterBasedLdapUserSearch( "", "(sAMAccountName={0})", contextSource ); authenticator.setUserSearch(userSearch); // (可选)如果你的AD不允许匿名搜索用户,需要配置一个有搜索权限的服务账号 // authenticator.setBindDn("CN=LDAP服务账号,OU=Service Accounts,DC=demodemo,DC=net"); // authenticator.setBindPassword("你的服务账号密码"); return authenticator; }
关于application.properties的说明
你现有的配置不需要大改,spring.ldap.base已经指定了用户所在的OU路径,这样用户搜索会自动限定在这个范围内,既高效又安全:
spring.ldap.urls=ldap://162.143.100.202 spring.ldap.base.dn=DC=demodemo,DC=net spring.ldap.base=OU=ITS,OU=Users,OU=_OBDE,DC=demodemo,DC=net
原理说明
当用户输入john-do登录时,Spring会用(sAMAccountName=john-do)作为过滤器,在你配置的spring.ldap.base路径下搜索对应的用户,找到DN为CN=John, Doe,OU=ITS,OU=Users,OU=_OBDE,DC=demodemo,DC=net的账号后,再用这个DN和用户输入的密码去LDAP服务器做绑定认证,这样就实现了用sAMAccountName登录的需求。
注意事项
- 确认你的AD允许当前配置的账号(匿名或服务账号)有权限搜索
sAMAccountName属性,有些AD会限制匿名搜索,这时候必须配置有搜索权限的服务账号; - 检查
sAMAccountName的拼写,AD里这个属性名是固定的,别写错; - 如果测试时还是失败,可以开启LDAP的调试日志,看看搜索和绑定的具体过程,方便排查问题。
备注:内容来源于stack exchange,提问作者Sam




