繁体   English   中英

JNDI:如何使用逻辑非查询来搜索LDAP

[英]JNDI: How to use Logical not query to search LDAP

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

例如,

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

上面的语句绝对正常,它返回所有sn为Kumaran的人员条目。

假设我更改该语句以获取其sn 不是 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

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

更新:

尝试这个

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

请参阅RFC 2254:

filter :: =“(”(“ filtercomp”)“”

不是:: =“!” 过滤

您的代码应该像

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

它应该为您工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM