2013-02-01 56 views
2

我想知道是否有人熟悉如何在搜索篩選器中對LDAP中的userCertificate屬性使用二進制值。我知道如何用舊的JNDI API來做到這一點,但我很好奇,如果任何人都可以幫我在Netscape Directory SDK(netscape.ldap)中弄明白。使用Java Netscape目錄LDAP API和二進制篩選器值

JNDI API例如:

byte[] userCert = Base64.decodeBase64(base64Certificate); 
Hashtable<String, String> env = new Hashtable<String, String>(); 
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
env.put(Context.PROVIDER_URL, ldapURL); 
env.put(Context.SECURITY_PRINCIPAL, username); 
env.put(Context.SECURITY_CREDENTIALS, password); 
InitialDirContext context = new InitialDirContext(env); 
SearchControls controls = new SearchControls(); 
controls.setSearchScope(SearchControls.SUBTREE_SCOPE); 
controls.setReturningAttributes(fetchArray); 
Enumeration<SearchResult> results = context.search(baseDN, "userCertificate={0}", new Object[] {userCert}, controls); 

什麼,我會像做的是使用下面的API,但沒有得到任何結果,而上面的代碼所做的:

byte[] userCert = Base64.decodeBase64(base64Certificate); 
LDAPConnection ld = new LDAPConnection(); 
ld.connect(ldapURL, ldapPort); 

ld.authenticate(username, password); 

LDAPSearchResults results = ld.search(baseDN, LDAPConnection.SCOPE_SUB, "(userCertificate;binary=" + base64Certificate + ")", 
       fetchArray, false); 

我試着用/不用;二進制修飾符,並嘗試了二進制和base64值。但是,做的工作是如果我寫一個自定義的方法來將字節數組轉換爲「\ xx」字符串格式。這似乎有點hackish,可能很慢,所以我想知道是否有一個API本地的方式來做這樣的二進制搜索。

謝謝。

+0

如果你要切換LDAP的API,Netscape的API是十來歲,長出來的任何維護活動,我可以看到的。你可能會更喜歡UnboundID API:@TerryGardner經常在這裏看到它,至少它看起來正在維護中。如果您無法做到這一點,請仔細閱讀LDAP搜索過濾器RFC。 – EJP

+0

謝謝。這個Netscape LDAP API已經在項目中使用了,所以我現在必須用一次性的JNDI設置完成一次搜索。我很想切換到更現代的API,但我正在處理我們所得到的。 :)我會看看我是否可以從RFC中收集任何東西。 – Patrick

回答

2

如果您想要爲其數據類型顯示爲二進制十六進制值的屬性(相關數據類型通常稱爲「八位字節串」)編寫過濾器,則完全不同。

如果要過濾這些二進制屬性,則必須聲明必須在十六進制代碼中進行比較的每個單個字節。例如,如果你搜索與屬性「庫存」其值爲0x01AAF5EF對象,那麼適當的過濾器將不得不讀:

(Inventory=\01\aa\f5\ef) 

不幸的是,二進制屬性搜索時通配符搜索是不允許的!

Try this link for more

+0

是的,這是我不得不做的 - 它轉換成'Octet String'格式。我猜JNDI實現自動執行此操作。 – Patrick