如何在ApacheDS 1.5.5上实现自定义分区?

时间:2011-04-29 20:56:33

标签: java security ldap apacheds

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

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

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

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

我正在使用ApacheDS 1.5.5版。

非常感谢!

2 个答案:

答案 0 :(得分:1)

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

  1. 开始搜索的点头的DN
  2. 您要撤消的属性
  3. 过滤器((&(objectClass = *))
  4. 搜索的深度
  5. 为了深度,你有3种可能性

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

    如果我回到你的问题。请注意SCHEMA中定义的类型的实现。类型都来自类型top。如果我以示例inetOrgPerson为例,您可以在SCHEMA中看到此类型是organizationalPerson的子级,这是person的一个小时,这是top的一个小时。 1}}。在这种特殊情况下,inetOrgPerson对象的objectClass属性值为4次:

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

    因此,如果您使用像(&(objectClass = person))这样的过滤器编写搜索PDU,您的结果中会有personorganizationalPersoninetOrPerson类型的对象。

    在某些搜索工具中,如果过滤器编写错误或不理解,则使用默认过滤器((&(objectClass = *))(这意味着一切)。

答案 1 :(得分:0)

我前段时间工作了,但没时间发布解决方案。

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

我能够构建初始分区。然而,这对我的情况没有用。如果ApacheDS有更好的文档,那就太好了。

因此,对于过滤,我收到了来自Apache开发者列表的电子邮件,基本上解释说根本没有课程可以帮助你,你必须自己动手(如果我错了,请纠正我,因为我感兴趣很快改进我的代码。)

例如,您有过滤器(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.

问候。