使用 Active Directory LDAP 的多个 CN 组身份验证

Multiple CN groups authentication with Active Directory LDAP

将 Active Directory 与 Spring 用于 LDAP,如果我指定搜索的确切目录(基础),例如 String base="CN=Administrators" search/authentication 找到用户,但如果传递给方法.authenticate(String base="", filter, password),其中base是一个空字符串,然后找不到它并给出错误

ldapTemplate.authenticate("", MessageFormat.format("(SamAccountName={0})", login), "password")

//error
org.springframework.ldap.PartialResultException: Unprocessed Continuation Reference(s); 
nested exception is javax.naming.PartialResultException: Unprocessed Continuation Reference(s);
remaining name '/'

此外,如果我连接到 OpenLDAP 而不是 Active Directory,它允许我指定一个空字符串 LdapTemplate.authenticate(String base="", filter, password) 并找到用户。据我了解,OpenLDAP 允许搜索所有组,这正是我需要的。

比如我有几个CN组,比如CN=AdministratorsCN=FreeUsersCN=System等,里面有很多CN用户。 如何允许 Active Directory 在验证时搜索所有这些文件?

A​​ctive Directory 不喜欢空字符串,除非将搜索范围设置为 base 以发现 RootDSE。不过 Active Directory 支持 LDAP_SERVER_SEARCH_OPTIONS_OID control,尤其是控制值 SERVER_SEARCH_FLAG_PHANTOM_ROO:

This enables search bases such as the empty string, which would cause the server to search all of the NC replicas (except for application NCs on AD DS DCs) that it holds.

将 Spring 用于 LDAP,您可能必须继承 AbstractRequestControlDirContextProcessor.java。 您可能已经从其他控件中获得灵感 defined 并将此新控件包含在您的搜索中。

我通过向 LdapTemplate 添加配置解决了这个问题。现在模板在不指定基础的情况下在 AD 中查找用户。

@Bean
public LdapTemplate ldapTemplate() {
    LdapTemplate ldapTemplate = new LdapTemplate(contextSource());
    return ldapTemplate;
}

现在

@Bean
public LdapTemplate ldapTemplate() {
    LdapTemplate ldapTemplate = new LdapTemplate(contextSource());
    ldapTemplate.setIgnorePartialResultException(true);
    return ldapTemplate;
}