Spring LDAPの概要

1概要

LDAPディレクトリサーバーは、読み取りに最適化された階層データストアです。

通常、これらはユーザーの認証と承認に必要なユーザー関連の情報を保存するために使用されます。

この記事では、Spring LDAP APIを調べて、ユーザーの認証と検索、およびディレクトリサーバーでのユーザーの作成と変更を行います。 LDAP内の他のタイプのエントリを管理するために同じAPIセットを使用できます。

2 Mavenの依存関係

必要なMavenの依存関係を追加することから始めましょう。

<dependency>
    <groupId>org.springframework.ldap</groupId>
    <artifactId>spring-ldap-core</artifactId>
    <version>2.3.1.RELEASE</version>
</dependency>

この依存関係の最新バージョンはhttps://search.maven.org/classic/#search%7C1%7Cg%3A%22org.springframework.ldap%22%20AND%20a%3A%22spring-ldapにあります-core%22[spring-ldap-core]

3データ準備

この記事の目的のために、まず次のLDAPエントリを作成しましょう。

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

このノードの下で、新規ユーザーの作成、既存ユーザーの変更、既存ユーザーの認証、および情報の検索を行います。

4 Spring LDAP API

** 4.1. ContextSource

ContextSource は、 LdapTemplate を作成するために使用されます。次のセクションでは、ユーザー認証中に ContextSource が使用されることを確認します。

@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 は、LDAPエントリの作成と変更に使用されます。

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

4.2. ユーザ認証

既存のユーザーを認証するための簡単なロジックを実装しましょう。

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

4.3. ユーザー作成

次に、新しいユーザーを作成し、パスワードのSHAハッシュをLDAPに保存しましょう。

認証時に、LDAPサーバーは提供されたパスワードのSHAハッシュを生成し、それを保管されているものと比較します。

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() は、指定されたパスワードのSHAハッシュのBase64エンコード文字列を返すカスタムメソッドです。

最後に、 LdapTemplate bind() メソッドを使用してLDAPサーバーにエントリを作成します。

4.4. ユーザー変更

次の方法で既存のユーザーまたはエントリを修正できます。

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

lookupContext() メソッドは、提供されたユーザーを見つけるために使用されます。

4.5. ユーザー検索

検索フィルタを使用して既存のユーザーを検索できます。

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

AttributesMapper は、見つかったエントリから目的の属性値を取得するために使用されます。内部的には、Spring LdapTemplate は見つかったすべてのエントリに対して AttributesMapper を呼び出し、属性値のリストを作成します。

5テスト中

spring-ldap-test は、ApacheDS 1.5.5に基づく組み込みLDAPサーバを提供します。テスト用に組み込みLDAPサーバーをセットアップするには、次のSpring Beanを構成する必要があります。

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

ユーザー検索方法をJUnitでテストしましょう。

@Test
public void
  givenLdapClient__whenCorrectSearchFilter__thenEntriesReturned() {
    List<String> users = ldapClient
      .search(SEARCH__STRING);

    assertThat(users, Matchers.containsInAnyOrder(USER2, USER3));
}

6. 結論

この記事では、Spring LDAP APIを紹介し、ユーザー認証、ユーザー検索、ユーザー作成、およびLDAPサーバーでの変更のための簡単な方法を開発しました。

いつものように完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/spring-ldap[このGithubプロジェクト]で利用可能です。テストはMavenプロファイル「live」の下に作成されるため、オプション「-P live」を使用して実行できます。