簡體   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