2017-11-17 12 views
0

Meine Firma hat Active Directory eingerichtet. Ich mache eine Anwendung, deren Anmeldesystem mit diesem AD verbunden werden sollte, also habe ich Spring LDAP-Authentifizierung eingerichtet, um es zu implementieren.LDAP-Suche AD findet keine Einträge

Aber wenn ich versuche, die Anwendung anzumelden, erhalte ich

Failed to locate directory entry for authenticated user: my.name 

javax.naming.NameNotFoundException: [LDAP: error code 32 - 0000208D: NameErr: DSID-03100213, problem 2001 (NO_OBJECT), data 0, best match of: 
'DC=dev,DC=company,DC=corp' 

My Spring Security Code wie folgt aussieht:

@Configuration 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 


    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
       .authorizeRequests() 
       .anyRequest().fullyAuthenticated() 
       .and() 
       .formLogin(); 
    } 


    @Override 
    protected void configure(AuthenticationManagerBuilder auth) throws Exception{ 
     auth.authenticationProvider(activeDirectoryLdapAuthenticationProvider()).userDetailsService(userDetailsService()); 
    } 

    @Bean 
    public AuthenticationManager authenticationManager() { 
     return new ProviderManager(Arrays.asList(activeDirectoryLdapAuthenticationProvider())); 
    } 

    @Bean 
    public AuthenticationProvider activeDirectoryLdapAuthenticationProvider() { 
     ActiveDirectoryLdapAuthenticationProvider provider = new ActiveDirectoryLdapAuthenticationProvider("company.hr", "ldap://10.23.1.1:389/dc=dev,dc=company,dc=corp"); 
     provider.setConvertSubErrorCodesToExceptions(true); 
     provider.setUseAuthenticationRequestCredentials(true); 

     return provider; 
    } 
} 

Eines der Probleme ist, dass unsere AD-Struktur wirklich ist verzweigt und jede dieser Organisationseinheiten hat eine weitere Unterteilung:

AD tree structure

Lesen auf LDAP, ich dachte, es nur den Pfad zu dem gemeinsamen übergeordneten Ordner sollte rekursive Suche durch den Baum und finden Sie den passenden Benutzer, egal, was OU sie sind, und tatsächlich, wenn ich einen dsquery Befehl ausführen Prompt gibt es die abgefragten Benutzer zurück, egal wo sie sind. Dies geschieht jedoch nicht im Frühjahr. Ich habe so ziemlich alles gelesen, was es zu dem Thema zu finden gibt, und habe stundenlang debugged - aber es scheint, dass meine Parameter richtig eingestellt sind, trotzdem bekomme ich die Exception.

Meine Frage wäre - wie Spring zu sehen, dass der Benutzer tatsächlich in Active Directory ist, ohne die vollständige URL zu diesem bestimmten Benutzer anzugeben (da es Dutzende von verschiedenen Organisationseinheiten gibt)?

+0

Führen Sie die Suche innerhalb von JXplorer durch, um den Parameter richtig einzustellen. Sie geben die Parameter und Werte für die von Ihnen verwendete Suche nicht an. Erscheint, dass Sie nach my.name suchen. Versuchen Sie dsquery user -amid mein.name – jwilleke

Antwort

0

Die Lösung gefunden. Manchmal hilft das erneute Lesen der Dokumentation zum X-ten Zeitpunkt.

änderte ich den Konstruktoraufruf des ActiveDirectoryLdapAuthenticationProvider von diesem

@Bean 
public AuthenticationProvider activeDirectoryLdapAuthenticationProvider() { 
    ActiveDirectoryLdapAuthenticationProvider provider = new ActiveDirectoryLdapAuthenticationProvider("company.hr", "ldap://10.23.1.1:389/dc=dev,dc=company,dc=corp"); 
    provider.setConvertSubErrorCodesToExceptions(true); 
    provider.setUseAuthenticationRequestCredentials(true); 

    return provider; 
} 

dieser

ActiveDirectoryLdapAuthenticationProvider provider = new ActiveDirectoryLdapAuthenticationProvider("company.hr", "ldap://10.23.1.1:389", "dc=dev,dc=company,dc=corp"); 

Der dritte Parameter in der constrcutor in der Tat "rootdn" ist, das ist so der Ort, wo es sein sollte übergeben werden, nicht als Erweiterung der URL.