我是根据我们公司的广告开发的:
@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
中将其追溯到两行:而searchForUser(ctx, username)
中的doAuthentication(...)
(5.0.12.RELEASE中的第148行)与我的sAMAccountName
(如 foobar ),contextFactory.createContext(env)
中的bindAsUser(...)
(5.0.12.RELEASE中的第204行)需要完全限定的DN(如 cn = foobar,ou = people,dc = acme,dc = com )。
所以看来我这边有一些配置错误,可能是由于我的误解...似乎我确实需要一些其他用户进行身份验证,而不是之后进行搜索?我该如何配置,和/但为什么我们公司的AD可以正常工作? PS:我读到有关匿名身份验证的信息,也许我们公司允许这样做?但是根据公司的AD使用Apache Directory Studio要求我登录(据我所知)...
答案 0 :(得分:1)
基于LDAP的简单BIND操作始终需要输入的专有名称(DN)和密码。只有AD允许使用samAccountName执行BIND操作。 AD有点特殊。