【问题标题】:JNDI: How to use Logical not query to search LDAPJNDI:如何使用逻辑不查询来搜索 LDAP
【发布时间】:2016-05-03 04:58:27
【问题描述】:

我在应用逻辑非查询时遇到问题。

例如,

NamingEnumeration<SearchResult> results =
    context.search("ou=people,dc=example,dc=com", "sn=Kumaran", searcCon);

上面的语句工作得很好,它返回了所有 sn 是 Kumaran 的人条目。

假设我更改语句以获取所有 sn 为 not Kumaran 的人员条目。

NamingEnumeration<SearchResult> results =
   context.search("ou=people,dc=example,dc=com", "(!sn=Kumaran)", searcCon);

我收到以下错误:

Exception in thread "main" javax.naming.directory.InvalidSearchFilterException: Unbalanced parenthesis; remaining name 'ou=people,dc=example,dc=com'
    at com.sun.jndi.ldap.Filter.findRightParen(Filter.java:694)
    at com.sun.jndi.ldap.Filter.encodeFilterList(Filter.java:733)
    at com.sun.jndi.ldap.Filter.encodeComplexFilter(Filter.java:657)
    at com.sun.jndi.ldap.Filter.encodeFilter(Filter.java:118)
    at com.sun.jndi.ldap.Filter.encodeFilterString(Filter.java:74)
    at com.sun.jndi.ldap.LdapClient.search(LdapClient.java:548)
    at com.sun.jndi.ldap.LdapCtx.doSearch(LdapCtx.java:1985)
    at com.sun.jndi.ldap.LdapCtx.searchAux(LdapCtx.java:1844)
    at com.sun.jndi.ldap.LdapCtx.c_search(LdapCtx.java:1769)
    at com.sun.jndi.toolkit.ctx.ComponentDirContext.p_search(ComponentDirContext.java:392)
    at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(PartialCompositeDirContext.java:358)
    at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(PartialCompositeDirContext.java:341)
    at javax.naming.directory.InitialDirContext.search(InitialDirContext.java:267)
    at jndi_tutorial.Test.getPeopleSnIsKumaran(Test.java:34)
    at jndi_tutorial.Test.main(Test.java:62)

以下是我的代码

public static void printResults(NamingEnumeration<SearchResult> results)
            throws NamingException {
        while (results.hasMoreElements()) {
            SearchResult res = results.next();
            Attributes atbs = res.getAttributes();
            Attribute nameAttr = atbs.get("cn");
            String name = (String) nameAttr.get();

            Attribute descriptionAtr = atbs.get("description");
            String description = (String) descriptionAtr.get();
            System.out.println(description);

            System.out.println("Name is :" + name + ",description is :"
                    + description);

        }
    }

/* Get all people whose sn is not equal to Kumaran */
    public static void getAllExcludeKumaran() throws NamingException {
        SearchControls searcCon = new SearchControls();
        searcCon.setSearchScope(SearchControls.SUBTREE_SCOPE);
        NamingEnumeration<SearchResult> results = context.search(
                "ou=people,dc=example,dc=com", "(!(sn=Kumaran))", searcCon);
        printResults(results);
    }

参考

https://technet.microsoft.com/en-us/library/aa996205(v=exchg.65).aspx

【问题讨论】:

    标签: java ldap jndi ldap-query


    【解决方案1】:

    尝试加括号(!(sn=Kumaran))

    更新:

    试试这个

    ...
    SearchControls searcCon = new SearchControls();
    String[] attributeFilter = { "cn", "description" };
    searcCon.setReturningAttributes(attributeFilter);
    searcCon.setSearchScope(SearchControls.SUBTREE_SCOPE);
    ...
    

    【讨论】:

    • 我尝试了你的建议。这是工作。我面临的唯一问题是,我能够获取与描述属性相关的信息。但是当我查询属性 cn 时,我得到了 NullPointerException。 sn和cn之间有联系吗?
    • 我正在使用 Apache Directory Studio
    • 我需要查看您的所有代码才能回答。也许您需要明确指定所需的属性。
    • 仍然出现 NullPointerException
    • 一个奇怪的是,它给出了包括cn在内的所有属性信息,用于查询“NamingEnumeration results = context.search("ou=people,dc=example,dc=com" , "sn=Kumaran", searcCon);".这里我没有使用逻辑不是(!),我只是搜索了所有人,其中 sn = Kumaran。
    【解决方案2】:

    参见 RFC 2254:

    filter ::= "(" filtercomp ")"

    不是 ::= "!"过滤

    你的代码应该是这样的

    context.search("ou=people,dc=example,dc=com", "((!sn=Kumaran))", searcCon);
    

    它应该适合你。

    【讨论】:

      猜你喜欢
      • 2015-09-02
      • 2013-05-28
      • 2016-04-20
      • 1970-01-01
      • 1970-01-01
      • 2015-04-25
      • 1970-01-01
      • 2020-08-14
      • 1970-01-01
      相关资源
      最近更新 更多