3

长问题的应用程序,但简而言之,我想知道如何org.springframework.ldap.core.LdapTemplate#ignorePartialResultException使用 Spring Java Config 设置标志。

长篇大论的问题是......

我想首先使用我们公司的 Active Directory 进行身份验证(我的意思是用户/密码检查),然后再进行授权(因此他们有权使用哪些角色)。

我采用了spring ldap 指南并进行了更改以连接到我们公司的 Active Directory,而不是使用该指南的 LDIF 文件。我从调试中知道该程序连接到 Active Directory 并正确验证了用户,但是在检索权限时,我得到以下异常:

Unprocessed Continuation Reference(s); nested exception is javax.naming.PartialResultException

从谷歌搜索我看到这是一个常见的 LDAP/ActiveDirectory 问题,我需要设置标志以忽略引用。我按照这个 SO question中的示例进行操作。但是,我仍然遇到异常,并且从调试中我可以看到在为用户搜索角色时,以下方法中发生了错误。

org.springframework.ldap.core.LdapTemplate#search(org.springframework.ldap.core.SearchExecutor, org.springframework.ldap.core.NameClassPairCallbackHandler, org.springframework.ldap.core.DirContextProcessor) 

供参考我的 WebSecurityConfig 文件:

    @Bean
    public BaseLdapPathContextSource contextSource() throws Exception {
        DefaultSpringSecurityContextSource contextSource = new DefaultSpringSecurityContextSource("ldap://<ad-host>:389/");

        contextSource.setUserDn(/*principleCN*/);
        contextSource.setPassword(/*principlePassword*/);
        contextSource.setReferral("ignore"); 
        contextSource.afterPropertiesSet();

        return contextSource;
    }

    @Override
    public void init(AuthenticationManagerBuilder auth) throws Exception {
        auth.ldapAuthentication()
                .userSearchFilter("(&(sAMAccountName={0})(objectclass=user))")
                .userSearchBase("dc=<company>,dc=local")
                .groupSearchBase("dc=<company>,dc=local")
                .contextSource(contextSource());
    }
4

1 回答 1

6

对于我可以告诉你的可以通过 实现这一点DefaultLdapAuthoritiesPopulator,它有一种setIgnorePartialResultException(boolean)方法可以实现这一点。

因此,在您的配置类中,您需要执行以下操作:

@Bean
public LdapAuthoritiesPopulator ldapAuthoritiesPopulator() throws Exception {
    DefaultLdapAuthoritiesPopulator populator = new DefaultLdapAuthoritiesPopulator(contextSource(), "dc=<company>,dc=local");
    populator.setIgnorePartialResultException(true);
    return populator;
}

@Override
public void init(AuthenticationManagerBuilder auth) throws Exception {
    auth.ldapAuthentication()
            .userSearchFilter("(&(sAMAccountName={0})(objectclass=user))")
            .userSearchBase("dc=<company>,dc=local")
            .contextSource(contextSource())
            .ldapAuthoritiesPopulator(ldapAuthoritiesPopulator());
}

一个警告是我没有明确测试过这个,所以你可能需要稍微调整一下你的配置。

于 2014-12-19T11:03:05.350 回答