长期问题的用途,但总之我想知道如何使用Spring Java Config设置org.springframework.ldap.core.LdapTemplate#ignorePartialResultException
标志。
冗长的问题是......
我想使用我们的公司Active Directory进行身份验证(我的意思是用户/密码检查)开始,然后用于授权(以便他们有权使用哪些角色)。
我使用了spring ldap guide并进行了更改以连接到我们公司的Active Directory,而不是使用指南的LDIF文件。我从调试中知道程序连接到Active目录并正确验证用户,但在检索权限时,我得到以下异常:
Unprocessed Continuation Reference(s); nested exception is javax.naming.PartialResultException
从谷歌上搜索我发现这是一个常见的LDAP / ActiveDirectory问题,我需要设置标志来忽略引用。我按照this 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());
}
答案 0 :(得分:5)
我可以告诉您可以通过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());
}
有一点需要注意的是,我没有明确地对此进行测试,因此您可能需要稍微使用一下配置。