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);
}
}
}