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

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

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

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

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

person Chris L    schedule 06.11.2014    source источник


Ответы (1)


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

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

@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);
        }
    }
}
person Chris L    schedule 11.11.2014