2016-08-12 8 views
0

Ich versuche LDAP-Authentifizierung von Spring Security zu verwenden. Alles ist in Ordnung. Ich bekomme den folgenden Fehler beim Bereitstellen der Anwendung.Spring Security LDAP-Authentifizierung funktioniert nicht mit Java 8

Caused by: java.lang.RuntimeException: Could not postProcess [email protected]efa of type class org.springframework.security.ldap.server.ApacheDSContainer 
    at org.springframework.security.config.annotation.configuration.AutowireBeanFactoryObjectPostProcessor.postProcess(AutowireBeanFactoryObjectPostProcessor.java:70) 
    at org.springframework.security.config.annotation.SecurityConfigurerAdapter$CompositeObjectPostProcessor.postProcess(SecurityConfigurerAdapter.java:123) 
    at org.springframework.security.config.annotation.SecurityConfigurerAdapter.postProcess(SecurityConfigurerAdapter.java:82) 
    at org.springframework.security.config.annotation.authentication.configurers.ldap.LdapAuthenticationProviderConfigurer.access$400(LdapAuthenticationProviderConfigurer.java:58) 
    at org.springframework.security.config.annotation.authentication.configurers.ldap.LdapAuthenticationProviderConfigurer$ContextSourceBuilder.build(LdapAuthenticationProviderConfigurer.java:555) 
    at org.springframework.security.config.annotation.authentication.configurers.ldap.LdapAuthenticationProviderConfigurer$ContextSourceBuilder.access$500(LdapAuthenticationProviderConfigurer.java:446) 
    at org.springframework.security.config.annotation.authentication.configurers.ldap.LdapAuthenticationProviderConfigurer.getContextSource(LdapAuthenticationProviderConfigurer.java:606) 
    at org.springframework.security.config.annotation.authentication.configurers.ldap.LdapAuthenticationProviderConfigurer.build(LdapAuthenticationProviderConfigurer.java:76) 

Federkernversion ist 4.3.2. Spring Security LDAP-Version ist 4.1.1.

In meiner Google-Umfrage wurde 2013 ein Beitrag veröffentlicht, der besagt, dass das Problem auf einer Inkompatibilität zwischen Spring Security LDAP und Java 8 beruht. Der gleiche Artikel sagte, dass es in einer Spring Boot-Version behoben wurde. Es wird nicht über eine Korrektur für nicht Spring-Boot-Bibliotheken gesprochen.

Hat jemand Spring Safety LDAP-Authentifizierung mit Java 8 versucht? Bitte helfen Sie.

Antwort

1

Hier ist meine funktionierende Konfiguration mit Java 8 und Spring Security LDAP. Wir verbinden unsere Spring Web App mit einer Active Directory-Instanz, um den Zugriff über URL zu sichern.

Wenn ich mich richtig erinnere, dauerte es länger als ich erwartet hatte, dass dies funktioniert.

Sie müssen die "Basis" für den LDAP-Kontextpfad ändern, und beachten Sie, dass der ldap.user der vollständige LDAP-CN ist und nicht nur ein Benutzername. Sie können LDAP-Browser wie JXplorer (http://jxplorer.org/) verwenden, um die LDAP-Einstellungen korrekt zu bekommen.

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Value; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.Profile; 
import org.springframework.ldap.core.support.BaseLdapPathContextSource; 
import org.springframework.ldap.core.support.LdapContextSource; 
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; 
import org.springframework.security.config.annotation.web.builders.HttpSecurity; 
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; 
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 

@Configuration 
@EnableWebSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

    private static final Logger LOGGER = LoggerFactory.getLogger(SecurityConfig.class); 

    @Value("ldap://${ldap.host}:${ldap.port:389}") 
    private String url; 

    @Value("${ldap.user}") 
    private String user; 

    @Value("${ldap.password}") 
    private String password; 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     LOGGER.info("Configuring security..."); 
     http.authorizeRequests() 
       .antMatchers("/").permitAll() 
       .antMatchers("/index.html").permitAll() 
       .anyRequest().fullyAuthenticated() 
       .and() 
       .httpBasic(); 
    } 

    @Autowired 
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
     auth.ldapAuthentication() 
      .userSearchFilter("(&(objectClass=user)(sAMAccountName={0}))") 
      .contextSource(ldapContextSource()); 
    } 

    @Bean 
    public BaseLdapPathContextSource ldapContextSource() { 
     LOGGER.info("LDAP: {}", url); 
     LdapContextSource bean = new LdapContextSource(); 
     bean.setUrl(url); 
     bean.setBase("DC=CORP,DC=MyCompany,DC=com"); 
     bean.setUserDn(user); 
     bean.setPassword(password); 
     bean.setPooled(true); 
     bean.setReferral("follow"); 
     return bean; 
    } 
} 

Dies vorausgesetzt, dass Sie Ihre LDAP-Einstellungen in einer Konfigurationsdatei haben, die so etwas wie dieser

ldap.host=ldap.mycompany.com 
ldap.user=CN=MyUser,OU=Service Accounts,OU=New-York,DC=CORP,DC=MyCompany,DC=com 
# Encrypt using Jasypt or something 
ldap.password=B1gS3cr3t 
+0

Dank viel für Ihre Antwort aussieht. Ich frage mich, ob die Verwendung des eingebetteten ApacheDS-LDAP-Servers in meinem Fall, d. H. Über die LDIF-Datei auf dem Klassenpfad, dazu führte, dass meine Anwendung fehlschlug? –

Verwandte Themen