最近因為項目需要,研究了下大名久仰的LDAP。它以目錄樹(shù)結構存放數據信息,和數據庫以表結構存放數據不同。網(wǎng)絡(luò )上關(guān)于LDAP的介紹很多,不是本文的重點(diǎn)。作為程序員,最關(guān)心的就是如何寫(xiě)程序去訪(fǎng)問(wèn)和操作LDAP數據,這也是本文所要討論的,但是局限于java程序。
一.JNDI(JAVA 命名及目錄接口)
JNDI是JAVA為命名及目錄服務(wù)訪(fǎng)問(wèn)制定的基礎接口標準,用于訪(fǎng)問(wèn)包括DNS,NIS,LDAP,文件系統等任何以樹(shù)目錄形式存在目標對象,并且基本上可保持訪(fǎng)問(wèn)方式的一致(意味著(zhù)代碼共用)。對于不同的目錄類(lèi)型,JNDI通過(guò)使用不同的目錄驅動(dòng),以保證訪(fǎng)問(wèn)方式的一致。以下連接可獲得較詳細的講解和例程:http://java.sun.com/products/jndi/tutorial/。經(jīng)常使用的LDAP驅動(dòng)有JDK自帶的LDAP provider,還有IBM的PROVIDER,以及NOVEL的JNDI產(chǎn)品。
二.jldap
JLDAP是由Novell開(kāi)發(fā)的,原是針對Novel的NDS目錄設計的JAVA訪(fǎng)問(wèn)工具。NOVEL的NDS和網(wǎng)景(NETSCAPE)的目錄是工具界最早的目錄產(chǎn)品。JLDAP并非JNDI的服務(wù)供應者,而是同一抽象層次下的訪(fǎng)問(wèn)工具集。與JNDI-LDAP相比,JLDAP更接近于類(lèi)關(guān)系數據庫的訪(fǎng)問(wèn)方式。NDS是遵守LDAP協(xié)議的并進(jìn)行了擴展的類(lèi)MAD產(chǎn)品。而NOVEL也已把JLDAP捐獻給了OPENLDAP開(kāi)源項目,可以世界范圍內自由使用。與JNDI相比,JLDAP無(wú)須繼承DirContext才能實(shí)現添加,也無(wú)需預先生成添加的類(lèi),可以象普通數據訪(fǎng)問(wèn)那樣,生成連接,然后使用add方法添加。這樣,添加的靈活性要強于JNDI。
三.JdbcLDAP驅動(dòng)
網(wǎng)絡(luò )上有2種形式的jdbc-Ldap驅動(dòng)程序,提供以sql的語(yǔ)法訪(fǎng)問(wèn)ldap數據庫。
1.OcterString的開(kāi)源驅動(dòng)
http://www.openldap.org/jdbcldap/提供下載。但是由于2005年11月被OERACLE并購,網(wǎng)絡(luò )上難以找到相關(guān)的資料,唯一可以參考的資料是其所帶的JDBC-LDAP Getting Started.pdf文檔。最初的1.0版本在連接時(shí)會(huì )有錯誤拋出,卻可以正常執行sql操作。通過(guò)自己編譯source可以得到較高的版本(難以找到最新版本的jar包),此版本可以正常使用。值得注意的是,在文檔中,關(guān)于刪除操作的ps.excute(SQL)有問(wèn)題,應該改成ps.excute(),不應該帶參數,因為delete操作不會(huì )返回結果,否則會(huì )產(chǎn)生空指針異常(NullPointerException)。實(shí)際上,這個(gè)驅動(dòng)引用了上面提到的jldap類(lèi)庫。在使用過(guò)程中,發(fā)現了本驅動(dòng)的一些bug。 其一,查詢(xún)結果集比實(shí)際數據多一條NULL的記錄,所以在取數據時(shí)的循環(huán)判斷要追加其它條件;
其二,查詢(xún)記錄后,會(huì )采用Base64的算法對數據進(jìn)行壓縮,但是對中文字符處理后會(huì )產(chǎn)生失真現象。需要更改com.octetstring.jdbcLdap.jndi.UnpackResults.java源代碼。文件中對查詢(xún)結果進(jìn)行了Base64.encode()的處理。而B(niǎo)ase64是由novell提供的ldap.jar包中的com.novell.ldap.util.Base64.java類(lèi)。去除Base64的處理并進(jìn)行適當的更改,能夠正常顯示中文。根據novell的ldap.jar包的API文檔,Base64處理用于轉換字符流為不可直接識別的字節碼,并且轉換后的數據量只有轉換之前的33%,節省了空間,提高了效率,但是對CJK文本的轉換會(huì )失真。
另外,由于使用了jdbcldap驅動(dòng),考慮把LDAP數據庫的節點(diǎn)映射為一個(gè)表,把節點(diǎn)屬性作為表項,采用Hibernate框架進(jìn)行數據操作,這種思想在做現存的Hibernate框架實(shí)現的系統轉LDAP單點(diǎn)登錄時(shí),是一種理想方案。實(shí)際上,這樣的映射可行,但是由于沒(méi)有合適的Hibernate Dialect方言,轉換出來(lái)的SQL操作無(wú)法正常執行。這種方案需要自行實(shí)現一個(gè)合適的Hibernate Dialect類(lèi)。
歡迎訪(fǎng)問(wèn) 風(fēng)卷流云 的blog
轉載請保留出處!