如何查询ldap以获取用户信息,因为ldap对象不是字符串

时间:2018-01-06 08:20:16

标签: java active-directory ldap spring-ldap ldap-query

我发现奇怪的是,在查询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类型为LdapNameName之类的ldap对象等。在//LdapName name = (LdapName) obj;行上进行的转换不会工作如此评论。

有没有使用JDK api来获取查询结果,因为ldap对象不是String? 如果没有使用JDK API,那么JAVA人员使用的下一个最佳API是什么。

2 个答案:

答案 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中,名称有NameLdapName,但是当它们来自属性String值时,您必须自己构建它们。

正好有两种格式可以返回LDAP 属性

  1. String
  2. byte[]
  3. 取决于您使用的架构和属性规范。

      

    问题是提取我需要进行字符串处理的任何用户或组信息,这是繁琐且容易出错的。

    不,你不是。您需要从Name构建LdapNameString个对象,这是微不足道的。

      

    所以我试图探索是否有任何方法可以使用JDK内置API

    我认为你的意思是指使用LDAP提供程序的JNDI。

      

    并将查询响应作为LDAP对象获取。

    见上文。