我正在研究MitreID Connect项目的LDAP覆盖,并且正在极大地工作:
我现在遇到的问题是如何检索LDAP目录中的操作属性。
我对Spring开发并不擅长,但是我找到了一些处理这个sub的文档,但是我无法使它工作。
这是我发现的:
检索操作属性
Ldap Server在内部维护许多操作属性。示例entryUUID是一个操作属性,它将通用唯一标识符(UUID)分配给该条目。 createTimestamp,modifyTimestamp也是在创建或更新时分配给条目的操作属性。这些操作属性不属于对象类,因此它们不会作为搜索或查找的一部分返回。您需要在搜索中通过其名称显式请求它们,或者使用匹配的属性名称构建自定义AttributeMapper实现。 现在让我们尝试检索entryUUID,首先你需要构建像这样的搜索控件,
SearchControls controls = new SearchControls();
controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
controls.setReturningObjFlag(false);
controls.setReturningAttributes(new String[]{"entryUUID"});
Once you have search control then it’s simply calling search method just like retrieving any other attributes.
ldapTemplate.search("baseName", "(objectclass=person)", controls, new AttributesMapper() {
public Object mapFromAttributes(Attributes attrs) throws NamingException {
Attribute attrUuid = attrs.get("entryUUID");
return attrUuid;
}});
以下是使用ContextMapper
执行相同操作的另一种方法ldapTemplate.search("baseName","(objectclass=person)", 1, new String[]{"entryUUID"},
new ContextMapper(){
public Object mapFromContext(Object ctx) {
DirContextAdapter context = (DirContextAdapter)ctx;
return context.getStringAttributes("entryUUID");
}
});
让我们根据以下操作属性添加过滤器,
OrFilter orFilter = new OrFilter();
orFilter.or(new GreaterThanOrEqualsFilter("createTimestamp", "YYYYMMDDHHMMSSZ"));
orFilter.or(new LessThanOrEqualsFilter("modifyTimestamp", "YYYYMMDDHHMMSSZ"));
现在使用过滤器
调用上述搜索ldapTemplate.search("baseName", orFilter.encode(), controls, new AttributesMapper() {
public Object mapFromAttributes(Attributes attrs) throws NamingException {
Attribute attrUuid = attrs.get("entryUUID");
return attrUuid;
}});