使用Spring Security和JavaConfig进行身份validation时出现PartialResultException

我目前正在使用Spring Boot创建一个新的Web应用程序,并开始集成Spring Security进行身份validation。 在成功遵循基于Spring Boot的LDAP教程之后 ,我想将基于JavaConfig的配置指向我的Active Directory实例。

我的应用程序现在按预期处理错误的凭据,但现在会产生有效的凭据

javax.naming.PartialResultException: Unprocessed Continuation Reference(s); remaining name '' 

这是一个常见问题 – 有很多 地方遇到过这个问题。 解决方案似乎是将Context.REFERRAL设置为“follow”,但我找不到任何说明如何使用JavaConfig设置该选项的文档。 这是我唯一可以恢复到基于XML的配置吗? 看起来Spring正在将开发人员推向JavaConfig,所以如果可能的话,我想避免混合使用这两种方法。

以下是我的安全配置:

 @Configuration @EnableWebMvcSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests().antMatchers("/css/**").permitAll().anyRequest() .fullyAuthenticated().and().formLogin(); } @Configuration protected static class AuthenticationConfiguration extends GlobalAuthenticationConfigurerAdapter { @Override public void init(AuthenticationManagerBuilder auth) throws Exception { auth.ldapAuthentication() .userSearchBase("") .userSearchFilter("(&(cn={0}))").contextSource() .managerDn("") .managerPassword("") .url("ldap://"); } } } 

我有一种感觉,我需要使用LdapContextSource的实例来实现这一点(因为它方便地有一个setReferral方法),但我对细节有点挣扎。 spring.io上的一个论坛post给了我足够的信息,看起来我现在已经有了工作。

我不清楚我在这里做的是否有任何重大缺陷,但它似乎有效,所以希望这将有助于未来的其他人:

 @Configuration @EnableWebMvcSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests().antMatchers("/css/**").permitAll().anyRequest() .fullyAuthenticated().and().formLogin(); } @Configuration protected static class AuthenticationConfiguration extends GlobalAuthenticationConfigurerAdapter { @Override public void init(AuthenticationManagerBuilder auth) throws Exception { DefaultSpringSecurityContextSource contextSource = new DefaultSpringSecurityContextSource("ldap://"); contextSource.setUserDn(""); contextSource.setPassword(""); contextSource.setReferral("follow"); contextSource.afterPropertiesSet(); LdapAuthenticationProviderConfigurer ldapAuthenticationProviderConfigurer = auth.ldapAuthentication(); ldapAuthenticationProviderConfigurer .userSearchFilter("(&(cn={0}))") .userSearchBase("") .contextSource(contextSource); } } }