0

我正在 Apache DS 上实现自定义分区(实现 org.apache.directory.server.core.partition.Partition)。

我可以在我的自定义分区上进行搜索,但是如果我想使用过滤器(即 objectClass=”person”),我的分区将返回找到的所有条目,根本没有过滤。

谁能举例说明如何使用自定义分区过滤“搜索”方法返回的条目?

此外,如果有人能指出我完成实现搜索方法的示例,我们将不胜感激。我需要更多信息,特别是关于搜索范围(OBJECT、ONELEVEL 或 SUBTREE)的信息。

我正在使用 1.5.5 版的 ApacheDS。

非常感谢!

4

2 回答 2

1

目录是一棵树。当您在目录中使用 LDAP 搜索(编写 SEARCH 协议数据单元)时,您会给出:

  1. 开始搜索的节点的 DN
  2. 您要检索的属性
  3. 过滤器 ((&(objectClass=*))
  4. 您搜索的深度

对于深度,你有 3 种可能性

  • 子树:尝试在递归搜索中从头开始匹配过滤器。
  • OneLevel :尝试仅在开始点头下的点头中匹配过滤器。
  • base :尝试将过滤器与 nod 属性匹配(用于获取 RootDSE 属性)。

如果我回到你的问题。请注意在 SCHEMA 中定义了类型的实现这一事实。类型都是从 type 派生的topinetOrgPerson如果我以您可以在 SCHEMA 中看到的类型为例,该类型是 的子项organizationalPerson,它是的子项,是 的子persontop。在这种特殊情况下,一个inetOrgPerson对象的objectClass属性值将是 4 次:

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

因此,如果您使用 (&(objectClass=person)) 之类的过滤器编写搜索 PDU,您将拥有从 发出的对象personorganizationalPersoninetOrPerson在结果中输入类型。

如果过滤器写得不好或不理解,则某些搜索工具中的另一件事是使用默认过滤器 ((&(objectClass=*)) (这意味着一切)。

于 2011-05-01T17:19:20.570 回答
0

前段时间我得到了这个工作,但没有时间发布解决方案。

基于此页面的示例:How to write a simple custom partition for apache ds。

我能够建立初始分区。然而,这对我的情况没有用。如果 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。因此,我们将得到 2.5.6 而不是“objectClass”,它是“objectClass”属性的 OID。

现在关于搜索范围,来自 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 回答