2014-11-06 7 views
9

Ich erstelle derzeit eine neue Webanwendung mit Spring Boot und begann mit der Integration von Spring Security für die Authentifizierung. Nachdem ich die Spring Boot-basierte Version LDAP tutorial erfolgreich ausgeführt hatte, wollte ich meine JavaConfig-basierte Konfiguration auf meine Active Directory-Instanz verweisen.PartialResultException bei der Authentifizierung mit Spring Security und JavaConfig

Meine Anwendung verarbeitet jetzt schlechte Anmeldeinformationen wie erwartet, aber gültige Anmeldeinformationen führen jetzt in

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

Dies ist ein häufiges Problem - es gibt ein numberofplaces wo dieses Problem aufgetreten ist. Die Lösung scheint Context.REFERRAL auf "follow" zu setzen, aber ich kann keine Dokumentation finden, die angibt, wie diese Option mithilfe von JavaConfig festgelegt wird. Ist meine einzige Option hier, um zu einer XML-basierten Konfiguration zurückzukehren? Es sieht so aus, als ob Spring die Entwickler in Richtung JavaConfig treibt, daher möchte ich es vermeiden, die beiden Ansätze zu mischen, wenn möglich.

Das folgende ist meine Sicherheitskonfiguration:

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

Antwort

13

Ich hatte das Gefühl, ich brauche eine Instanz von LdapContextSource zu verwenden, damit dies geschieht (da es bequem eine setReferral Methode hat), aber ich kämpfte eine Bisschen mit den Details. Eine forum post auf spring.io gab mir genug, um weiterzumachen, und es sieht so aus, als ob ich jetzt Dinge funktioniere.

Es ist mir nicht klar, ob es irgendwelche erhebliche Mängel mit dem, was ich hier mache, aber es scheint, zu arbeiten, so hoffentlich wird dies jemand hilfreich sein, sonst in die Zukunft:

@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); 
     } 
    } 
} 
Verwandte Themen