PartialResultException при аутентификации с помощью Spring Security и JavaConfig

в настоящее время я создаю новое веб-приложение с помощью Spring Boot и начал процесс интеграции Spring Security для аутентификации. После успешного выполнения Spring Boot-based LDAP учебник, Я хотел указать мою конфигурацию на основе JavaConfig на мой экземпляр Active Directory.

мое приложение теперь обрабатывает плохие учетные данные, как ожидалось, но действительные учетные данные теперь приводят к

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

Это общая проблема -- есть of мест где эта проблема была обнаружена. Решение представляется настройку контекста.Ссылка на "следовать", но я не могу найти никакой документации, указывающей, как установить эту опцию с помощью JavaConfig. Это мой единственный вариант здесь, чтобы вернуться к конфигурации на основе XML? Похоже, Весна подталкивает разработчиков к 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("<username>")
                .managerPassword("<password>")
                .url("ldap://<url>");
        }
    }
}

1 ответов


у меня было чувство, что мне нужно будет использовать экземпляр LdapContextSource чтобы это произошло (так как он удобно имеет setReferral метод), но я немного боролся с деталями. А сообщение на форуме весной.Ио дал мне достаточно, чтобы продолжать, и похоже, что теперь у меня все работает.

мне не ясно, есть ли какие-либо существенные недостатки в том, что я здесь делаю, но, похоже, это работает, поэтому, надеюсь, это будет полезно кому-то еще в будущем:

@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://<url>");
            contextSource.setUserDn("<username>");
            contextSource.setPassword("<password>");
            contextSource.setReferral("follow"); 
            contextSource.afterPropertiesSet();

            LdapAuthenticationProviderConfigurer<AuthenticationManagerBuilder> ldapAuthenticationProviderConfigurer = auth.ldapAuthentication();

            ldapAuthenticationProviderConfigurer
                .userSearchFilter("(&(cn={0}))")
                .userSearchBase("")
                .contextSource(contextSource);
        }
    }
}