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

如何向LDAP应用附加搜索查询

云光明
2023-03-14

我在本地机器上有一个通过SSL的LDAP服务器,并从同一台机器和我的应用程序连接它。下面是连接LDAP服务器的代码:

// Specify the search scope
    final String returnedAtts[] = { ldapSettingModel.getDepartment(),
            ldapSettingModel.getEmailId(), ldapSettingModel.getLocation(),
            ldapSettingModel.getRole(), ldapSettingModel.getDispName() };
    String searchFilter = "(&(objectClass=*)(" + ldapSettingModel.getLoginId() + "=" + user
            + ")" + ldapSettingModel.getFilter() + ")";

    String adPrincipal = user;
    if (CATAppConstants.ACTIVE_DIRECTORY_WIN_2000_ATTR.equals(ldapSettingModel.getLoginId())) {

        // with domain
        if (user.indexOf("\\") > 0) {
            user = user.substring(user.indexOf("\\") + 1);
            searchFilter = "(&(objectClass=*)(" + ldapSettingModel.getLoginId() + "=" + user
                    + ")" + ldapSettingModel.getFilter() + ")";
        } else {
            String[] pDN = ldapSettingModel.getBaseDNName().split(",");
            for (String dn : pDN) {
                if (dn.indexOf("dc=") == 0) {
                    adPrincipal = dn.substring(3) + "\\" + adPrincipal;
                    break;
                }
            }
        }

    }

    // Create the search controls
    SearchControls searchCtls = new SearchControls();
    searchCtls.setReturningAttributes(returnedAtts);
    searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
    String ldapProtocol = "ldap" + (ldapSettingModel.getSslFlg() == 1 ? "s" : "");
    String providerUrl = ldapProtocol + "://" + ldapSettingModel.getHost() + ":"
            + ldapSettingModel.getPortNo();
    Hashtable<String, String> env = new Hashtable<String, String>();
    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
    env.put(Context.PROVIDER_URL, providerUrl);
    if (ldapSettingModel.getSslFlg() == 1) {
        env.put(Context.SECURITY_PROTOCOL, "ssl");
        env.put("java.naming.ldap.factory.socket",
                "com.shift.tcm.serviceCust.authenticationManagement.CustomSSLSocketFactory");
    }
    env.put(Context.SECURITY_AUTHENTICATION, "simple");
    switch (ldapSettingModel.getLdapType()) {
    case CATAppConstants.DIRECTORY_TYPE_IS_ACTIVE_DIRECTORY:
        env.put(Context.SECURITY_PRINCIPAL, adPrincipal);
        break;
    default:
        env.put(Context.SECURITY_PRINCIPAL, ldapSettingModel.getLoginId() + "=" + user + ","
                + ldapSettingModel.getBaseDNName());
        break;
    }

    env.put(Context.SECURITY_CREDENTIALS, requestPassword);
    env.put("com.sun.jndi.ldap.connect.timeout", CATAppConstants.LDAP_CONNECT_TIMEOUT + "");

    LdapContext ctxGC = null;
    MstUserModel userDetails = null;

    // This is the actual Authentication piece. Will throw
    // javax.naming.AuthenticationException
    // if the users password is not correct. Other exceptions may
    // include IO (server not found) etc.
    ctxGC = new InitialLdapContext(env, null);

    // Now try a simple search and get some attributes as defined in
    // returnedAtts
    NamingEnumeration<SearchResult> answer = ctxGC.search(ldapSettingModel.getBaseDNName(),
            searchFilter, searchCtls);

    userDetails = getUserDetailsFromLDAP(answer, ldapSettingModel, checkDetailsOnly,
            currentRoleName);
    userDetails.setLoginId(user);

在尝试使用ldapsettingmodel.getfilter()添加搜索过滤器之前,一切都很好。通常,如果没有它,搜索筛选器将包含(&(ObjectClass=*)(UID=VAIBHAV)),用于以下LDAP服务器:

我试图允许用户使用ldapsettingmodel.getfilter()添加额外的搜索筛选器,我尝试使用以下方法搜索值:

    null

我不确定是否正确地应用了附加的搜索筛选器,但是namingenumeration answery 从我的getUserDetailsFromlDap()方法返回null。如果我做错了什么,请指导我,因为我对LDAP非常陌生。

共有1个答案

柯鸿振
2023-03-14
(&(objectClass=*)(uid=vaibhav)(cn=India))

这没道理。cn是“common name”的缩写。您没有通用名为'India'的用户。

应该是

(&(objectClass=*)(uid=vaibhav)(postalAddress=India))

事实上,当你在寻找用户时,它可能是

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

  • 我有一个lucene查询,可以对索引字段进行全文搜索。我想将日期范围添加到此查询。 我找到了这个问题并在那里使用了答案:如何在日期之间搜索(Hibernate搜索)? 但当我想在两个日期之间获取数据时,它什么也不返回。我使用的是MSSQL数据库,日期字段的类型是datetime。但它在实体类中被注释为。 这是我的实体类: 这就是我进行全文搜索的地方: 有两种不同的查询。一个是在指定字段上进行全文通

  • 问题内容: 我正在使用JNDI连接到LDAP活动目录,并且我想搜索名称包含搜索字符串的用户,因此我的搜索方法如下: 这是我与LDAP建立连接的方式: LDAP凭证如下: 为什么搜索需要那么多时间来检索数据?由于广告中只有285个联系人,我可以做些什么来加快搜索速度吗? 问题答案: 解决方案是更改为

  • 我安装并配置了OpenLDAP服务器,配置如下: 我测试了这个简单的Java LDAP客户机,以便通过发送用户名和密码对用户进行身份验证:

  • 我需要在身份验证后从LDAP中检索各种值,如描述、办公室等。 我已经能够完成身份验证,但无法检索其他值。 我应该使用什么名称来检索完整的数据?? 请帮助。 我的代码如下:

  • 我试图将一个名为sAMAccountName的新属性添加到一个已经存在的LDAP模式定义中,该定义由IM-LDAP使用UnboundID LDAP SDK读取。 我已经在MatchingGruleUse中添加了attributeTypes条目和sAMAccountName。 对于每个以前存在的属性,调用将返回属性类型。但不是因为我的新属性。 我错过了什么? 10/11/18在@jwilleke评论