当前位置: 首页 > 知识库问答 >
问题:

如何对各种字段进行LDAP搜索

蒋向笛
2023-03-14

我需要在身份验证后从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;
    }

共有2个答案

芮瑾瑜
2023-03-14

我发现了问题所在。

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

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

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

然后在获取属性时使用其值。

谢谢

宣星光
2023-03-14

LDAP客户端通过向服务器发送搜索请求,然后读取服务器的响应来检索属性值(在问题中称为“字段”)。搜索请求至少由以下组成:

  • base DN-开始搜索的对象。不返回基DN以上的对象
  • 范围-搜索的范围;这是baseone子树
  • filter-限制服务器返回的条目的过滤器

此外,请求的属性列表可以与搜索请求一起传输。如果没有提供请求的属性列表,许多LDAP SDK将简单地返回所有用户属性,而不返回操作属性。在这种情况下,请求属性描述office以及任何其他必需的属性。

LDAP兼容服务器强制执行访问控制方案,这可能会导致服务器不返回某些属性。咨询LDAP管理员,以确定LDAP客户端连接的身份验证状态是否具有访问所需属性的权限。

  • LDAP:使用ldapsearch:本文参考了ldapsearch命令行工具,但概念与编程访问相同。
 类似资料:
  • 我有一个用例,我需要找到客户的分页列表,其中客户看起来像这样: 然后我有了我的存储库界面 我的界面扩展了分页和排序存储库以提供可分页的结果。 我还有一个输入框,用户可以在其中放置任何字符串。现在我想给他一个结果页面,其中包含其中一个字段(任何客户字段)中的输入字符串。 我不想使用命名查询。有没有一种聪明的方法,我可以通过分页和排序存储库来实现这一点,或者我是否需要使用规范接口并实现分页?

  • 问题内容: 我正在玩LDAP和Java搜索。这是我的一个简单组织的LDIF导出 如何运行Java代码段以从LDAP服务器获取所有用户?我的Apache DS目录服务器上没有身份验证设置。 问题答案:

  • 如何使LDAP查询只返回所有级别中具有ou=groups的组? http://confluence.atlassian.com/display/dev/how+to+write+ldap+search+filters

  • 示例文档 索引定义 内部无源过滤的响应良好。 响应包含嵌套属性的所有属性。即开始时间、结束时间和文本行。如何在响应中仅返回endtime和startTime? 查询失败 错误HTTP/1.1 400错误请求内容类型:application/json;字符集=UTF-8内容长度:265 {"错误":{"root_cause":[{"type":"illegal_argument_exception"

  • 我想根据数字字段对搜索结果进行排序。在下面的示例代码中,我希望基于'Age'字段进行排序。我从以下答案开始: [如何在Lucene 6中对IntPont或LongPoint字段进行排序 [在Lucene中根据数字字段对搜索结果进行排序 我在搜索函数中将sortfield.type.score更改为sortfield.type.long。但我得到: 意外的docvalues为字段“年龄”键入NONE