Spring 安全 LDAP:针对 ApacheDS 中的 Active Directory 进行绑定与身份验证

Spring Security LDAP: Bind vs. Authenticate against Active Directory in ApacheDS

什么有效

我是针对我们公司的AD开发的:

@Bean
public AuthenticationProvider adProvider() {
    ActiveDirectoryLdapAuthenticationProvider adProvider = new ActiveDirectoryLdapAuthenticationProvider(
            adConfig.getDomain(), adConfig.getUrl(), adConfig.getRootDn());

    adProvider.setSearchFilter(adConfig.getSearchFilter());
    adProvider.setUseAuthenticationRequestCredentials(true);
    adProvider.setConvertSubErrorCodesToExceptions(true);
    adProvider.setAuthoritiesMapper(authorities -> List.of(new FooAuthority("*")));

    return adProvider;
}

这确实有效;我可以使用我的公司凭据登录。 重要:我可以使用我的 sAMAccountName(恰好也是我的 uid)登录。

目标

现在我想使用本地 AD 对某些边缘情况进行一些自动化测试。我选择 ApacheDS 是因为它的跨平台可用性,而且它有一些可用的 Docker 容器。我用 openmicroscopy/apacheds ,因为它看起来很活跃,有据可查且可配置,对像我这样的菜鸟很重要。

问题

问题是,我无法登录。我将其追溯到 o.s.security.ldap.authentication.ad.ActiveDirectoryLdapAuthenticationProvider 中的两行: while searchForUser(ctx, username) in doAuthentication(...)(5.0.[=46= 中的第 148 行) ]) 与我的 sAMAccountName 一起工作(如 foobar),contextFactory.createContext(env) in bindAsUser(...)(5.0.12.RELEASE 中的第 204 行)需要一个完全合格的 DN(如 cn=foobar,ou=people,dc=acme,dc=com)工作。

所以我这边似乎配置有误,可能是因为我的误解......似乎我确实需要一些不同的用户来验证而不是事后搜索?这个要怎么配置,and/but 为什么我们公司的AD就可以了? PS: 我看过匿名认证,也许我们公司允许这样?但是使用 Apache Directory Studio 对付公司的 AD 需要我登录(据我所知)...

基于 LDAP 的简单 BIND 操作始终需要条目的可分辨名称 (DN) 和密码。只有 AD 允许使用 samAccountName 执行 BIND 操作。 AD有点特别