我发现奇怪的是,在查询ldap时,它以LDIF格式返回信息(希望对此推理是正确的)这很好,但是信息作为String对象而不是(某些)ldap对象返回(如用户) ,姓名或团体等)。问题是提取我需要进行字符串处理的任何用户或组信息,这是繁琐且容易出错的。所以我试图探索是否有任何方法可以使用JDK内置API并将查询响应作为LDAP对象。
以下是我不满意的代码 - (快速参考最后五行将有所帮助)
//code to setup env object - followed by below code
DirContext context = new InitialDirContext(env);
SearchControls searchCtls = new SearchControls();
searchCtls.setCountLimit(0);
searchCtls.setReturningAttributes(new String[] { "memberOf", "cn", "member"});
// searchCtls.setReturningAttributes(ldapSearchAttributes.split(","));
// searchCtls.setReturningAttributes(("member").split(","));
searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
NamingEnumeration<SearchResult> answer = context.search(searchBase, "(" + "CN=" + "someldapgroup" + ")", searchCtls);
System.out.println("answer:" + answer);
Map<String, Object> amap = null;
if (answer.hasMoreElements()) {
SearchResult sr = answer.next();
System.out.println("sr: " + sr);
System.out.println();
//Attributes attrs = answer.next().getAttributes();
Attributes attrs = sr.getAttributes();
System.out.println("attrs: " + attrs);
if (attrs != null) {
amap = new HashMap<String, Object>();
NamingEnumeration<? extends Attribute> ne = attrs.getAll();
//Attributes a = attrs.get(attrID);
while (ne.hasMore()) {
Attribute attr = ne.next();
System.out.println("attr: " + attr);
if (attr.getID().equalsIgnoreCase("memberOf") || attr.getID().equalsIgnoreCase("member")) {
NamingEnumeration emueration = attr.getAll();
List groups = new ArrayList();
while (emueration.hasMore()) {
Object obj =emueration.next();
groups.add(obj);
System.out.println(obj.getClass());
//LdapName name = (LdapName) obj;
System.out.println("obj: " + obj);
最后几行是我的烦恼。最后但第三行System.out.println(obj.getClass());
打印出类String,我希望这个obj类型为LdapName
或Name
之类的ldap对象等。在//LdapName name = (LdapName) obj;
行上进行的转换不会工作如此评论。
有没有使用JDK api来获取查询结果,因为ldap对象不是String? 如果没有使用JDK API,那么JAVA人员使用的下一个最佳API是什么。
答案 0 :(得分:0)
有几个特定的JAVA third-party LDAP libraries会返回&#34;对象&#34;并解决了JNDI的许多缺点。
我最喜欢的是UnboundID LDAP SDK,然后是Apache LDAP Java API
作为UnboundID LDAP SDK的例子:
for (SearchResultEntry entry : searchResult.getSearchEntries())
{
String name = entry.getAttributeValue("cn");
String mail = entry.getAttributeValue("mail");
}
该条目包含封装的LDAP条目。
答案 1 :(得分:0)
我发现奇怪的是,在查询ldap时,它以LDIF格式返回信息
不,它没有。
(希望我对这个推论是正确的)
你不是。
很好
这是不真实的。
但信息作为String对象而不是(某些)ldap对象(如用户,名称或组等)返回。
没有&#39; LDAP对象&#39;对应于&#39;用户&#39;或者&#39; group&#39;。在JNDI中,名称有Name
和LdapName
,但是当它们来自属性String
值时,您必须自己构建它们。
正好有两种格式可以返回LDAP 属性:
String
byte[]
取决于您使用的架构和属性规范。
问题是提取我需要进行字符串处理的任何用户或组信息,这是繁琐且容易出错的。
不,你不是。您需要从Name
构建LdapName
或String
个对象,这是微不足道的。
所以我试图探索是否有任何方法可以使用JDK内置API
我认为你的意思是指使用LDAP提供程序的JNDI。
并将查询响应作为LDAP对象获取。
见上文。