高度な LDAP クエリ

このセクションでは、Spring LDAP で LDAP クエリを使用するさまざまな方法について説明します。

LDAP クエリビルダーのパラメーター

LdapQueryBuilder とそれに関連するクラスは、LDAP 検索に提供できるすべてのパラメーターをサポートすることを目的としています。次のパラメーターがサポートされています。

  • base: 検索を開始する LDAP ツリーのルート DN を指定します。

  • searchScope: 検索がトラバースする LDAP ツリーの深さを指定します。

  • attributes: 検索から返される属性を指定します。デフォルトはすべてです。

  • countLimit: 検索から返されるエントリの最大数を指定します。

  • timeLimit: 検索にかかる最大時間を指定します。

  • 検索フィルター: 探しているエントリが満たさなければならない条件。

LdapQueryBuilder は、LdapQueryBuilder の query メソッドへの呼び出しで作成されます。これは流れるようなビルダー API として意図されており、基本パラメーターが最初に定義され、その後にフィルター仕様呼び出しが続きます。LdapQueryBuilder の where メソッドの呼び出しでフィルター条件の定義が開始されると、後で (たとえば) base を呼び出そうとしても拒否されます。基本検索パラメーターはオプションですが、少なくとも 1 つのフィルター仕様呼び出しが必要です。次のクエリは、オブジェクトクラスが Person のすべてのエントリを検索します。

例 1: オブジェクトクラス Person を持つすべてのエントリを検索します
import static org.springframework.ldap.query.LdapQueryBuilder.query;
...

List<Person> persons = ldapClient.search()
      .query(query().where("objectclass").is("person"))
      .toList(new PersonAttributesMapper());

次のクエリは、オブジェクトクラスが person で、cn (共通名) が John Doe のすべてのエントリを検索します。

例 2: オブジェクトクラス person および cn=John Doe を持つすべてのエントリを検索します
import static org.springframework.ldap.query.LdapQueryBuilder.query;
...

List<Person> persons = ldapClient.search()
      .query(query().where("objectclass").is("person").and("cn").is("John Doe"))
      .toList(new PersonAttributesMapper());

次のクエリは、person のオブジェクトクラスを持ち、dc=261consulting,dc=com の dc (ドメインコンポーネント) で始まるすべてのエントリを検索します。

例 3: dc=261consulting,dc=com で始まるオブジェクトクラス person を持つすべてのエントリを検索します
import static org.springframework.ldap.query.LdapQueryBuilder.query;
...

List<Person> persons = ldapClient.search()
      .query(query().base("dc=261consulting,dc=com").where("objectclass").is("person"))
      .toList(new PersonAttributesMapper());

次のクエリは、オブジェクトクラスが person で、dc (ドメインコンポーネント) の dc=261consulting,dc=com で始まるすべてのエントリの cn (共通名) 属性を返します。

例 4: dc=261consulting,dc=com で始まるクラス Person を持つすべてのエントリを検索し、cn 属性のみを返します
import static org.springframework.ldap.query.LdapQueryBuilder.query;
...

Stream<Person> persons = ldapClient.search()
      .query(query().base("dc=261consulting,dc=com")
             .attributes("cn")
             .where("objectclass").is("person")),
      .toStream(new PersonAttributesMapper());

次のクエリは、or を使用して、共通名 (cn) の複数のスペルを検索します。

例 5: or 条件で検索
import static org.springframework.ldap.query.LdapQueryBuilder.query;
...
Stream<Person> persons = ldapClient.search()
      .query(query().where("objectclass").is("person"),
             .and(query().where("cn").is("Doe").or("cn").is("Doo"))
      .toStream(new PersonAttributesMapper());

フィルター基準

前の例は、LDAP フィルターでの単純な等しい条件を示しています。LDAP クエリビルダーは、次の条件型をサポートしています。

  • is: 等号 (=) 条件を指定します。

  • gte: 以上 (>=) 条件を指定します。

  • lte: 以下 (⇐) 条件を指定します。

  • like: クエリにワイルドカードを含めることができる「類似」条件を指定します。たとえば、where("cn").like("J*hn Doe") は次のフィルターになります。: (cn=J*hn Doe).

  • whitespaceWildcardsLike: すべての空白がワイルドカードに置き換えられる条件を指定します。たとえば、where("cn").whitespaceWildcardsLike("John Doe") は次のフィルターになります。: (cn=John*Doe).

  • isPresent: 属性の存在をチェックする条件を指定します。たとえば、where("cn").isPresent() は次のフィルターになります。: (cn=*).

  • not: 現在の条件を否定する必要があることを指定します。たとえば、where("sn").not().is("Doe) は次のフィルターになります。: (!(sn=Doe))

ハードコードされたフィルター

ハードコードされたフィルターを LdapQuery への入力として指定したい場合があります。LdapQueryBuilder には、この目的のために 2 つの方法があります。

  • filter(String hardcodedFilter): 指定された文字列をフィルターとして使用します。指定された入力文字列はまったく変更されないことに注意してください。つまり、ユーザー入力からフィルターを構築する場合、この方法は特に適していません。

  • filter(String filterFormat, String…​ params): 指定された文字列を MessageFormat への入力として使用し、パラメーターを適切にエンコードして、フィルター文字列の指定された場所に挿入します。

  • filter(Filter filter): 指定されたフィルターを使用します。

ハードコードされたフィルターメソッドを前述の where アプローチと混在させることはできません。それはどちらかです。filter() を使用してフィルターを指定すると、後で where を呼び出そうとすると例外が発生します。