如何做好各个领域的LDAP搜索(How to do an LDAP Search of Variou

2019-07-30 06:47发布

我有获取各种值,如身份验证后说明,办公等从LDAP的要求。

我已经能够完成认证,但我不能检索其它值。

我应该用什么名字来检索完整的数据?

请帮忙。

我的代码如下:

    public boolean authenticate(String userid, String pass, String domain) {
        boolean retval = false;
        String searchFilter ="(&(objectClass=user)(" + LDAP_UID_ATTR + "=" + userid + "))";


        try {
            System.out.println("Start: getLDAPAttrs");
            NamingEnumeration answer =
                getLDAPAttrs(userid, pass, searchFilter, domain);
            String uid = "";

            while (answer.hasMoreElements()) {
                SearchResult sr = (SearchResult)answer.next();

                Attributes attrs = sr.getAttributes();

                try {
                    uid = attrs.get(LDAP_UID_ATTR).toString();
                    System.out.println("uid: " + uid);
                    System.out.println(attrs.get("mail"));
                    uid = uid.substring(uid.indexOf(':') + 2);
                } catch (Exception err) {
//                    uid = "";
                    System.out.println(err.getMessage());
                    err.printStackTrace();
                }

                // verify userid
                if (userid.equalsIgnoreCase(uid)) {
                    retval = true;

                    break;
                }
            }
        } catch (NamingException ne) {
            System.out.println("In authenticateWithLDAP, LDAP Authentication NamingException : " +
                               ne.getMessage());
        } catch (Exception ex) {
            System.out.println("In authenticateWithLDAP, LDAP Authentication Exception : " +
                               ex.getMessage());
        }

        return retval;
        //        return retval;
    }

    private NamingEnumeration getLDAPAttrs(String userid, String pass,
                                           String searchFilter,
                                           String domain) throws NamingException,
                                                                 Exception {
        String host = getServerName();
        String port = getIP_Port();
        String dcPart1 = getDcPart1();
        String dcPart2 = getDcPart2();
//        String attrUserID = getLDAP_UID_ATTR();
//        String attrUserName = getLDAP_UNAME_ATTR();

        // set attribute names to obtain value of
        String[] returnedAtts = { "sAMAccountName", "cn","mail" };
        SearchControls searchCtls = new SearchControls();
        searchCtls.setReturningAttributes(returnedAtts);

        // specify the search scope
        searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);

        // set search base
        String searchBase = "DC=" + dcPart1 + ",DC=" + dcPart2;

        // set ldap env values
        Hashtable environment = new Hashtable();
        environment.put(Context.INITIAL_CONTEXT_FACTORY,
                        "com.sun.jndi.ldap.LdapCtxFactory");
        environment.put(Context.PROVIDER_URL, "ldap://" + host + ":" + port);
        environment.put(Context.SECURITY_AUTHENTICATION, "simple");
        environment.put(Context.SECURITY_PRINCIPAL, userid + "@" + domain);
        environment.put(Context.SECURITY_CREDENTIALS, pass);

        // set ldap context
        DirContext ctxGC = new InitialDirContext(environment);

        // perform search to obtain values
        NamingEnumeration answer =
            ctxGC.search(searchBase, searchFilter, searchCtls);
        return answer;
    }

Answer 1:

LDAP客户机检索属性值(被称为在这个问题:“字段”)通过发送搜索请求到服务器,然后读取服务器的响应。 的搜索请求包括至少以下组分组成:

  • 基本DN - 对象处开始搜索。 基本DN上面没有对象返回
  • 范围 - 搜索的范围; 这是baseone ,或subtree
  • 过滤器 - 这限制了由服务器返回的条目的过滤器

此外,要求属性的列表可以与搜索请求被发送。 如果没有提供请求的属性列表许多LDAP的SDK将简单地返回所有的用户属性和没有操作属性。 在这种情况下,请求属性descriptionoffice ,并要求任何人。

LDAP兼容的服务器执行这可能会导致服务器无法返回某些属性的访问控制方案。 与LDAP管理员协商,以确定如果LDAP客户端连接的认证状态有权访问所期望的属性。

也可以看看

  • LDAP:使用ldapsearch :本文指ldapsearch命令行工具,但其概念是一样的编程访问。


Answer 2:

我发现了什么是错误的。

我必须包括在返回的属性参数:

String[] returnedAtts = { "sAMAccountName", "cn","mail" };

要么

String[] returnedAtts = { "sAMAccountName", "cn","mail","description" };

然后,在获得属性利用其价值的时间。

谢谢



文章来源: How to do an LDAP Search of Various fields
标签: java ldap