Spring LDAP Übersicht

1. Übersicht

LDAP-Verzeichnisserver sind leseoptimierte hierarchische Datenspeicher. In der Regel werden sie zum Speichern benutzerbezogener Informationen verwendet, die für die Benutzerauthentifizierung und -autorisierung erforderlich sind.

In diesem Artikel werden die Spring LDAP-APIs zur Authentifizierung und Suche nach Benutzern sowie zum Erstellen und Ändern von Benutzern auf dem Verzeichnisserver erläutert. Der gleiche Satz von APIs kann für die Verwaltung aller anderen Arten von Einträgen in LDAP verwendet werden.

2. Maven-Abhängigkeiten

Beginnen wir mit dem Hinzufügen der erforderlichen Maven-Abhängigkeit:

 org.springframework.ldap spring-ldap-core 2.3.1.RELEASE 

Die neueste Version dieser Abhängigkeit finden Sie unter spring-ldap-core.

3. Datenvorbereitung

Für den Zweck dieses Artikels erstellen wir zunächst den folgenden LDAP-Eintrag:

ou=users,dc=example,dc=com (objectClass=organizationalUnit)

Unter diesem Knoten erstellen wir neue Benutzer, ändern vorhandene Benutzer, authentifizieren vorhandene Benutzer und suchen nach Informationen.

4. Spring LDAP APIs

4.1. ContextSource & LdapTemplate Bean Definition

ContextSource wird zum Erstellen der LdapTemplate verwendet . Wir werden die Verwendung von ContextSource während der Benutzerauthentifizierung im nächsten Abschnitt sehen:

@Bean public LdapContextSource contextSource() { LdapContextSource contextSource = new LdapContextSource(); contextSource.setUrl(env.getRequiredProperty("ldap.url")); contextSource.setBase( env.getRequiredProperty("ldap.partitionSuffix")); contextSource.setUserDn( env.getRequiredProperty("ldap.principal")); contextSource.setPassword( env.getRequiredProperty("ldap.password")); return contextSource; }

LdapTemplate wird zum Erstellen und Ändern von LDAP-Einträgen verwendet:

@Bean public LdapTemplate ldapTemplate() { return new LdapTemplate(contextSource()); }

4.2. Benutzerauthentifizierung

Lassen Sie uns nun eine einfache Logik implementieren, um einen vorhandenen Benutzer zu authentifizieren:

public void authenticate(String username, String password) { contextSource .getContext( "cn=" + username + ",ou=users," + env.getRequiredProperty("ldap.partitionSuffix"), password); }

4.3. Benutzererstellung

Als Nächstes erstellen wir einen neuen Benutzer und speichern einen SHA-Hash des Kennworts in LDAP.

Zum Zeitpunkt der Authentifizierung generiert der LDAP-Server den SHA-Hash des angegebenen Kennworts und vergleicht ihn mit dem gespeicherten:

public void create(String username, String password) { Name dn = LdapNameBuilder .newInstance() .add("ou", "users") .add("cn", username) .build(); DirContextAdapter context = new DirContextAdapter(dn); context.setAttributeValues( "objectclass", new String[] { "top", "person", "organizationalPerson", "inetOrgPerson" }); context.setAttributeValue("cn", username); context.setAttributeValue("sn", username); context.setAttributeValue ("userPassword", digestSHA(password)); ldapTemplate.bind(context); }

DigestSHA () ist eine benutzerdefinierte Methode, die die Base64-codierte Zeichenfolge des SHA-Hashs des angegebenen Kennworts zurückgibt.

Schließlich wird die bind () -Methode von LdapTemplate verwendet, um einen Eintrag im LDAP-Server zu erstellen.

4.4. Benutzermodifikation

Wir können einen vorhandenen Benutzer oder Eintrag mit der folgenden Methode ändern:

public void modify(String username, String password) { Name dn = LdapNameBuilder.newInstance() .add("ou", "users") .add("cn", username) .build(); DirContextOperations context = ldapTemplate.lookupContext(dn); context.setAttributeValues ("objectclass", new String[] { "top", "person", "organizationalPerson", "inetOrgPerson" }); context.setAttributeValue("cn", username); context.setAttributeValue("sn", username); context.setAttributeValue("userPassword", digestSHA(password)); ldapTemplate.modifyAttributes(context); }

Die lookupContext () -Methode wird verwendet, um den angegebenen Benutzer zu finden.

4.5. Benutzersuche

Wir können mithilfe von Suchfiltern nach vorhandenen Benutzern suchen:

public List search(String username) { return ldapTemplate .search( "ou=users", "cn=" + username, (AttributesMapper) attrs -> (String) attrs.get("cn").get()); }

Der AttributesMapper wird verwendet, um den gewünschten Attributwert aus den gefundenen Einträgen abzurufen. Intern ruft Spring LdapTemplate den AttributesMapper für alle gefundenen Einträge auf und erstellt eine Liste der Attributwerte.

5. Testen

spring-ldap-test bietet einen eingebetteten LDAP-Server, der auf ApacheDS 1.5.5 basiert. Um den eingebetteten LDAP-Server zum Testen einzurichten, müssen Sie die folgende Spring Bean konfigurieren:

@Bean public TestContextSourceFactoryBean testContextSource() { TestContextSourceFactoryBean contextSource = new TestContextSourceFactoryBean(); contextSource.setDefaultPartitionName( env.getRequiredProperty("ldap.partition")); contextSource.setDefaultPartitionSuffix( env.getRequiredProperty("ldap.partitionSuffix")); contextSource.setPrincipal( env.getRequiredProperty("ldap.principal")); contextSource.setPassword( env.getRequiredProperty("ldap.password")); contextSource.setLdifFile( resourceLoader.getResource( env.getRequiredProperty("ldap.ldiffile"))); contextSource.setPort( Integer.valueOf( env.getRequiredProperty("ldap.port"))); return contextSource; }

Testen wir unsere Benutzersuchmethode mit JUnit:

@Test public void givenLdapClient_whenCorrectSearchFilter_thenEntriesReturned() { List users = ldapClient .search(SEARCH_STRING); assertThat(users, Matchers.containsInAnyOrder(USER2, USER3)); }

6. Fazit

In diesem Artikel haben wir Spring LDAP-APIs vorgestellt und einfache Methoden für die Benutzerauthentifizierung, Benutzersuche, Benutzererstellung und -änderung auf einem LDAP-Server entwickelt.

Wie immer ist der vollständige Quellcode in diesem Github-Projekt verfügbar. Die Tests werden unter dem Maven-Profil "live" erstellt und können daher mit der Option "-P live" ausgeführt werden.