openldap 比起其他商業目錄服務器(比如 IBM Directory Server),特別的輕巧,十分適合於本地開發測試用,在產品環境中的表現也很優秀。
openldap 軟件在它的官方網站 http://www.openldap.org, 不過下載過來是源代碼,並沒有包含 win32 下的 Makefile 文件,只提供了在 Unix/Linux 下編譯用的 Makefile。所以相應的在網上介紹在 windows 下安裝使用 openldap 的資料比較少,而在 Unix/Linux 下應用文檔卻很豐富。
本文實踐了在 Windows 下安裝配 openldap,並添加一個條目,LdapBrowser 瀏覽,及 Java 程序連接 openldap 的全過程。
1. 下載安裝 openldap for windows,當前版本2.2.29
下載地址:http://download.bergmans.us/openldap/openldap-2.2.29/openldap-2.2.29-db-4.3.29-openssl-0.9.8a-win32_Setup.exe
相關鏈接:http://lucas.bergmans.us/hacks/openldap/
安裝很簡單,一路 next 即可,假設我們安裝在 c:/openldap
2. 配置 openldap,編輯 sldap.conf 文件
1) 打開 c:/openldap/sldap.conf,找到
include C:/openldap/etc/schema/core.schema,在它後面添加
include C:/openldap/etc/schema/cosine.schema
include C:/openldap/etc/schema/inetorgperson.schema
接下來的例子只需要用到以上三個 schema,當然,如果你覺得需要的話,你可以把其他的 schema 全部添加進來
include C:/openldap/etc/schema/corba.schema
include C:/openldap/etc/schema/dyngroup.schema
include C:/openldap/etc/schema/java.schema
include C:/openldap/etc/schema/misc.schema
include C:/openldap/etc/schema/nis.schema
include C:/openldap/etc/schema/openldap.schema
2) 還是在 sldap.conf 文件中,找到
suffix "dc=my-domain,dc=com"
rootdn "cn=Manager,dc=my-domain,dc=com"
把這兩行改爲
suffix "o=tcl,c=cn"
rootdn "cn=Manager,o=tcl,c=cn"
suffix 就是看自己如何定義了,後面步驟的 ldif 文件就必須與它定義了。還要注意到這個配置文件中有一個 rootpw secret,這個 secret 是 cn=Manager 的密碼,以後會用到,不過這裏是明文密碼,你可以用命令: slappasswd -h {MD5} -s secret 算出加密的密碼 {MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ== 取代配置中的 secret。
3. 啓動 openldap
CMD 進入到 c:/openldap 下,運行命令 sldapd -d 1
用可以看到控制檯下打印一片信息,openldap 默認是用的 Berkeley DB 數據庫存儲目錄數據的。
4. 建立條目,編輯導入 ldif 文件
1) 新建一個 ldif(LDAP Data Interchanged Format) 文件(純文本格式),例如 test.ldif,文件內容如下:
dn: o=tcl,c=cn
objectClass: dcObject
objectClass: organization
o: tcl
dc: com
dn: uid=Unmi, o=tcl,c=cn
uid: Unmi
objectClass: inetOrgPerson
mail: [email protected]
userPassword:: MTIzNDU2
labeledURI: http://unmi.blogcn.com
sn: Qiu
cn: 隔葉黃鶯
2) 執行命令:ldapadd -x -D "cn=manager,o=tcl,c=cn" -w secret -f test.ldif
導入組織信息和一個用戶 uid=Unmi
5. LdapBrowser 瀏覽
可點擊鏈接 http://www.blogjava.net/Files/Unmi/LdapBrowser282.rar 下載,其中已配置好了 OpenLdap_Localhost
1) 設置如下圖所示:
指定了 Host 爲 localhost 之後,可以點擊 Fetch DNs 按鈕顯示出 o=tcl,c=cn 來,如果要能在 LdapBrowser 中對數據能修改就不能用 Anonymous bind, 必須填上 User DN: cn=manager,Passwer: secret。
2) 看到的效果是:
6. Java 連接 openldap
- import java.util.Hashtable;
- import javax.naming.Context;
- import javax.naming.NamingException;
- import javax.naming.directory.DirContext;
- import javax.naming.directory.InitialDirContext;
- public class LDAPTest {
- public static void main(String[] args) {
- LDAPTest LDAPTest1 = new LDAPTest();
- String root = "o=tcl,c=cn" ; //root
- Hashtable env = new Hashtable();
- env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory" );
- env.put(Context.PROVIDER_URL, "ldap://localhost/" + root);
- env.put(Context.SECURITY_AUTHENTICATION, "simple" );
- env.put(Context.SECURITY_PRINCIPAL, "cn=Manager,o=tcl,c=cn" );
- env.put(Context.SECURITY_CREDENTIALS, "secret" );
- DirContext ctx = null ;
- try {
- ctx = new InitialDirContext(env);
- System.out.println( "認證成功" );
- }
- catch (javax.naming.AuthenticationException e) {
- e.printStackTrace();
- System.out.println( "認證失敗" );
- }
- catch (Exception e) {
- System.out.println( "認證出錯:" );
- e.printStackTrace();
- }
- if (ctx != null ) {
- try {
- ctx.close();
- }
- catch (NamingException e) {
- //ignore
- }
- }
- }
- }
代碼中還沒有實現用戶的查找,讀取、修改條目屬性的操作