LDAP 搜索 AD 找不到条目

LDAP searching AD finds no entries

我的公司设置了 Active Directory。我正在制作一个应用程序,其登录系统应链接到该 AD,因此我设置了 Spring LDAP 身份验证来实现它。

但是当我尝试登录应用程序时,我得到

Failed to locate directory entry for authenticated user: my.name

javax.naming.NameNotFoundException: [LDAP: error code 32 - 0000208D: NameErr: DSID-03100213, problem 2001 (NO_OBJECT), data 0, best match of:
'DC=dev,DC=company,DC=corp'

我的 Spring 安全码如下所示:

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {


    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .anyRequest().fullyAuthenticated()
                .and()
                .formLogin();
    }


    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception{
        auth.authenticationProvider(activeDirectoryLdapAuthenticationProvider()).userDetailsService(userDetailsService());
    }

    @Bean
    public AuthenticationManager authenticationManager() {
        return new ProviderManager(Arrays.asList(activeDirectoryLdapAuthenticationProvider()));
    }

    @Bean
    public AuthenticationProvider activeDirectoryLdapAuthenticationProvider() {
        ActiveDirectoryLdapAuthenticationProvider provider = new ActiveDirectoryLdapAuthenticationProvider("company.hr", "ldap://10.23.1.1:389/dc=dev,dc=company,dc=corp");
        provider.setConvertSubErrorCodesToExceptions(true);
        provider.setUseAuthenticationRequestCredentials(true);

        return provider;
    }
}

其中一个问题是我们的AD结构真的是分支出来的,而且每一个组织单元都有进一步的细分:

阅读 LDAP,我认为只给它公共父文件夹的路径应该通过树进行递归搜索并找到匹配的用户,无论他们在哪个 OU 中,事实上,如果我做dsquery 在命令提示符下它会 return 查询用户,无论他们在哪里。但是,Spring 不会发生这种情况。我已经阅读了关于该主题的几乎所有内容,并调试了几个小时 - 但似乎我的参数设置正确,但我仍然抛出异常。

我的问题是 - 如何让 Spring 看到用户实际上在 Active Directory 中,而不向该特定用户指定完整的 URL(因为有几十个不同的 OU)?

找到解决方案。有时,第X次重读文档确实有帮助。

我从这里更改了 ActiveDirectoryLdapAuthenticationProvider 的构造函数调用

@Bean
public AuthenticationProvider activeDirectoryLdapAuthenticationProvider() {
    ActiveDirectoryLdapAuthenticationProvider provider = new ActiveDirectoryLdapAuthenticationProvider("company.hr", "ldap://10.23.1.1:389/dc=dev,dc=company,dc=corp");
    provider.setConvertSubErrorCodesToExceptions(true);
    provider.setUseAuthenticationRequestCredentials(true);

    return provider;
}

至此

ActiveDirectoryLdapAuthenticationProvider provider = new ActiveDirectoryLdapAuthenticationProvider("company.hr", "ldap://10.23.1.1:389", "dc=dev,dc=company,dc=corp");

constrcutor中的第三个参数实际上是"rootDn",所以这是应该传递的地方,而不是作为URL的扩展。