0

Apache DSにカスタムパーティションを実装しています(org.apache.directory.server.core.partition.Partitionを実装しています)。

カスタムパーティションで検索を行うことはできますが、フィルタ(つまり、objectClass =” person”)を使用する場合、パーティションは見つかったすべてのエントリを返し、フィルタリングはまったく行われません。

カスタムパーティションを使用して「search」メソッドによって返されるエントリをフィルタリングする方法の例を誰かに教えてもらえますか?

また、検索方法の実装例を教えていただければ幸いです。特に検索スコープ(OBJECT、ONELEVEL、またはSUBTREE)に関する詳細情報が必要です。

ApacheDSのバージョン1.5.5を使用しています。

どうもありがとう!

4

2 に答える 2

1

ディレクトリはツリーです。次のディレクトリでLDAPを使用して検索(SEARCHプロトコルデータユニットを作成)すると、次のようになります。

  1. 検索を開始するうなずきのDN
  2. 取得する属性
  3. フィルタ((&(objectClass = *))
  4. 検索の深さ

深さのためにあなたは3つの可能性を持っています

  • サブツリー:最初のうなずきからの再帰検索でフィルターを一致させてみてください。
  • OneLevel:最初のうなずきの下のうなずきでのみフィルターを一致させようとします。
  • base:フィルターをnod属性(RootDSE属性を取得するために使用)と一致させてみてください。

私があなたの問題に戻ったら。SCHEMAで定義された型の実装があるという事実に注意してください。タイプはすべてタイプから派生しtopます。例として、inetOrgPersonスキーマでこのタイプがの子であることがわかるタイプを取り上げます。これは、の子でありorganizationalPerson、の子personですtop。この特定のケースでは、inetOrgPersonオブジェクトのobjectClass属性値は4回になります。

objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson

したがって、(&(objectClass = person))のようなフィルターを使用して検索PDUを作成すると、から発行されたオブジェクトが作成され、person結果が入力されます。organizationalPersoninetOrPerson

一部の検索ツールでは、フィルターが正しく記述されていないか、理解されていない場合、デフォルトのフィルター((&(objectClass = *))が使用されます(これはすべてを意味します)。

于 2011-05-01T17:19:20.570 に答える
0

私はこれをしばらく前に機能させましたが、解決策を投稿する時間がありませんでした。

このページの例に基づく:apacheds用の単純なカスタムパーティションを作成する方法。

最初のパーティションを作成することができました。しかし、これは私の場合には役に立ちませんでした。ApacheDSにもっと良いドキュメントがあれば素晴らしいと思います。

したがって、フィルタリングについては、Apache Developers Listから、基本的に役立つクラスがないことを説明するメールを受け取りました。自分で行う必要があります(コードの改善に興味があるので、間違っている場合は修正してください)すぐ)。

たとえば、フィルター(objectClass = person)を取得したら、次のようにする必要があります。

if(ctx.getFilter().toString().contains("objectClass=person")) {
  //Somehow return entries that only correspond to persons on the data base (were you store your directory entries).
}

実際、ApacheDSは属性名を対応するOIDに変換するため、上記のコード例は機能しないことに注意してください。したがって、「objectClass」の代わりに、「objectClass」属性のOIDである2.5.6を取得します。

さて、検索範囲に関しては、JPBlancからの回答はそれについてほとんど述べているので、私は彼が言ったことを繰り返しません。カスタムパーティションでは、ツリーケースを異なる方法で処理するコードを記述する必要があります。

例えば:

switch (ctx.getScope()) {

  case OBJECT:
    //Find a particular entry on your entry database.
  case ONELEVEL:
    //Find all entries that match directly below a given entry.
  case SUBTREE:
    //Find all entries that match recursively below a given entry.

よろしく。

于 2011-05-30T00:18:27.533 に答える