高度な LDAP クエリ
このセクションでは、Spring LDAP で LDAP クエリを使用するさまざまな方法について説明します。
LDAP クエリビルダーのパラメーター
LdapQueryBuilder
とそれに関連するクラスは、LDAP 検索に提供できるすべてのパラメーターをサポートすることを目的としています。次のパラメーターがサポートされています。
base
: 検索を開始する LDAP ツリーのルート DN を指定します。searchScope
: 検索がトラバースする LDAP ツリーの深さを指定します。attributes
: 検索から返される属性を指定します。デフォルトはすべてです。countLimit
: 検索から返されるエントリの最大数を指定します。timeLimit
: 検索にかかる最大時間を指定します。検索フィルター: 探しているエントリが満たさなければならない条件。
LdapQueryBuilder
は、LdapQueryBuilder
の query
メソッドへの呼び出しで作成されます。これは流れるようなビルダー API として意図されており、基本パラメーターが最初に定義され、その後にフィルター仕様呼び出しが続きます。LdapQueryBuilder
の where
メソッドの呼び出しでフィルター条件の定義が開始されると、後で (たとえば) base
を呼び出そうとしても拒否されます。基本検索パラメーターはオプションですが、少なくとも 1 つのフィルター仕様呼び出しが必要です。次のクエリは、オブジェクトクラスが Person
のすべてのエントリを検索します。
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
のすべてのエントリを検索します。
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
(ドメインコンポーネント) で始まるすべてのエントリを検索します。
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
(共通名) 属性を返します。
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
) の複数のスペルを検索します。
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
を呼び出そうとすると例外が発生します。