Frühjahrs-LDAP-Übersicht

Spring LDAP Übersicht

1. Überblick

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. Dieselbe Gruppe von APIs kann für die Verwaltung anderer Einträge 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 unterspring-ldap-core.

3. Datenaufbereitung

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 werden neue Benutzer erstellt, vorhandene Benutzer geändert, vorhandene Benutzer authentifiziert und nach Informationen gesucht.

4. Spring LDAP-APIs

4.1. ContextSource &LdapTemplate Bean Definition

ContextSource wird zum Erstellen derLdapTemplate verwendet. Wir werden die Verwendung vonContextSource 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

Implementieren wir nun eine einfache Logik, 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 Kennwort:

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-Hash des angegebenen Kennworts zurückgibt.

Schließlich wird diebind()-Methode vonLdapTemplate 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);
}

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

Wir können mit Suchfiltern nach vorhandenen Benutzern suchen:

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

DasAttributesMapper wird verwendet, um den gewünschten Attributwert aus den gefundenen Einträgen zu erhalten. Intern ruft SpringLdapTemplateAttributesMapper 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 wir 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 inthis Github project verfügbar. Die Tests werden unter dem Maven-Profil "live" erstellt und können daher mit der Option "-P live" ausgeführt werden.