You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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登录的需求。

注意事项

  1. 确认你的AD允许当前配置的账号(匿名或服务账号)有权限搜索sAMAccountName属性,有些AD会限制匿名搜索,这时候必须配置有搜索权限的服务账号;
  2. 检查sAMAccountName的拼写,AD里这个属性名是固定的,别写错;
  3. 如果测试时还是失败,可以开启LDAP的调试日志,看看搜索和绑定的具体过程,方便排查问题。

备注:内容来源于stack exchange,提问作者Sam

火山引擎 最新活动