我正在Apache DS上实现自定义分区(实现org.apache.directory.server.core.partition.Partition)。
我可以在我的自定义分区上进行搜索,但是如果我想使用过滤器(即objectClass =“person”),我的分区将返回找到的所有条目,根本没有过滤。
有人能举例说明如何使用自定义分区过滤“搜索”方法返回的条目吗?
此外,如果有人能指出我完成实施搜索方法的示例,我们将非常感激。我需要更多信息,特别是关于搜索范围(OBJECT,ONELEVEL或SUBTREE)。
我正在使用ApacheDS 1.5.5版。
非常感谢!
答案 0 :(得分:1)
目录是一棵树。当您在目录中使用LDAP搜索(编写SEARCH协议数据单元)时,您可以:
为了深度,你有3种可能性
如果我回到你的问题。请注意SCHEMA中定义的类型的实现。类型都来自类型top
。如果我以示例inetOrgPerson
为例,您可以在SCHEMA中看到此类型是organizationalPerson
的子级,这是person
的一个小时,这是top
的一个小时。 1}}。在这种特殊情况下,inetOrgPerson
对象的objectClass
属性值为4次:
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
因此,如果您使用像(&(objectClass = person))这样的过滤器编写搜索PDU,您的结果中会有person
,organizationalPerson
和inetOrPerson
类型的对象。
在某些搜索工具中,如果过滤器编写错误或不理解,则使用默认过滤器((&(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.
问候。