Lotus的JAVA與DOMINO通過LDAP集成方法!

摘要:LDAP是標準輕量目錄訪問協議(Lightweight Directory Access Protocol),通過LDAP,你可以訪問目錄中的用戶信息,進行用戶驗證。DominoR5/6支持標準的LDAP v3目錄服務。本文通過描述使用JNDI訪問Domino目錄的過程,爲大家介紹如何充分利用機構中已有的Domino目錄資源。本文所述的方法也適用於其他支持LDAP v3的目錄服務器。
爲什麼目錄服務如此重要
隨着企業中應用程序的增加,我們不得不面對日益增長的各類用戶數據。這些用戶數據分佈在企業各處,帶來了很大管理和維護上的麻煩。爲了解決這個問題,我們通常需要在企業中構建標準的目錄基礎設施。同時,在實施EAI(企業應用集成)時,我們還經常會遇到用戶需要單點登錄(SSO)的情況,而成功實施SSO的基礎是我們有一個好的目錄基礎。
目前,在很多的機構中都實施了基於Domino的應用,例如:辦公、郵件、審批等。做爲一個兼容各種標準的優秀平臺,Domino也提供了對LDAP v3的良好支持。
那麼,對於已經架設Domino基礎設施的機構,是否考慮從現有的投資中獲得更多的回報呢?下面,我們通過兩個範例來了解如何充分利用這些保存在Domino中的目錄資源。
準備工作
1、 瞭解JNDI
JNDI(Java Naming And Directory Interface)是在Java中訪問各種命名和目錄服務的規範。它通過一組擴展的API:javax.naming.*來提供對命名和目錄服務的訪問。
使用JNDI前,你必須確保你擁有jndi.jar,並且在當前ClassPath中包含它。如果你還沒有jndi.jar,可通過參考資料處下載。
2、 配置Domino服務器
在使用下列範例前,你必須先啓動你的Domino服務器(我使用R6版本)中,並且啓用LDAP服務。
由於我們不需要使用任何特殊的選項,我們無須對Domino的LDAP配置做出任何修改,僅須確認已加載了LDAP服務(在Domino Console上輸入:show tasks來查看是否加載了LDAP服務)。如果還沒有加載LDAP服務,你可以通過在Domino的服務器控制檯上輸入:load ldap來加載它。
讀取目錄信息
下面的代碼從目錄中讀取給定用戶的郵件地址。
package net.eservice4you.ldap;
import javax.naming.Context;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.DirContext;
import javax.naming.directory.Attributes;
import javax.naming.NamingException;
import java.util.Hashtable;
class Getattr {
    public static void main(String[] args) {
// Identify service provider to use
//將初始化的信息放到一個hashtable中去
Hashtable env = new Hashtable(11);
env.put(Context.INITIAL_CONTEXT_FACTORY, 
    "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://localhost:389/o=BJCHP");
// 你需要將localhost改爲domino服務器的全稱或IP,並且,將O=改爲你的Domino組織名稱
try {
// Create the initial directory context
    DirContext ctx = new InitialDirContext(env);
    // Ask for all attributes of the object 
    // 你需要將xinxibu改爲服務上已有的註冊用戶
    Attributes attrs = ctx.getAttributes("cn=xinxibu");
    // Find the mail address and print it
System.out.println("Mail: " + attrs.get("mail").get());
    // Close the context when we're done
    ctx.close();
} catch (NamingException e) {
    System.err.println("Problem getting attribute: " + e);
}
    }
}
從代碼中,我們看到讀取目錄信息的過程:
1. 設置所使用的Service Provider 和Service URI到Hashtable中。
2. 初始化一個DirContext。
3. 使用Context.getAttributes來獲取指定用戶的所有屬性信息。
4. 使用attrs.get(“xxx”)來獲得屬性信息。
5. 關閉Context的連接。
注:在Domino LDAP目錄默認只允許查找部分用戶信息。你可以查看Domino Administrator Help中“Domino目錄\Domino LDAP服務”一節,加入更多的屬性到列表中。
驗證用戶身份
下面的代碼通過請求LDAP用戶登錄,來驗證用戶的身份。
package net.eservice4you.ldap;
import javax.naming.Context;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.DirContext;
import javax.naming.NamingException;
import javax.naming.AuthenticationException;
import java.util.Hashtable;
class AuthUser {
    public static void main(String[] args) {
// Identify service provider to use
Hashtable env = new Hashtable(11);
env.put(Context.INITIAL_CONTEXT_FACTORY, 
    "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://localhost:389/o=BJCHP");
   // 你需要將localhost改爲domino服務器的全稱或IP,並且,將O=改爲你的Domino組織名稱
// Authenticate as xinxibu and password "1234"
   env.put(Context.SECURITY_AUTHENTICATION, "simple");
   env.put(Context.SECURITY_PRINCIPAL, "cn=xinxibu,o=BJCHP");
   env.put(Context.SECURITY_CREDENTIALS, "1234");
try {
// Create the initial directory context
    DirContext ctx = new InitialDirContext(env);
    System.out.println("Authentication Ok!");
    ctx.close();
}catch (AuthenticationException e){ 
// 如果捕捉到AuthenticationException,表示驗證失敗
System.err.println("Authentication Fail:"+e);
} catch (NamingException e) {
    System.err.println("Nameing Exception: " + e);
}
    }
}
我們可以看到,要驗證用戶,我們需要做以下幾件事:
1. 設置所使用的Service Provider 和URL到Hashtable中。
2. 設置驗證方式,用戶名和密碼(對於simple)。
3. 初始化一個DirContext。如果捕捉到AuthenticationException異常,表示驗證失敗。
4. 關閉Context的連接。
除了我們剛纔使用的simple方式外,還可以使用Digest-MD5, Kerberos V5和X.509等方式來驗證。你可以查看參考資料來了解具體的細節。
總結
如果你的機構中已使用了Domino,如果你需要應用集成,是時候考慮LDAP!
本文所述的方法,同樣適用於IBM Directory Server和OpenLDAP等其他目錄服務器。我在JDK 1.4.1+ Domino 6下測試通過了這些代碼。你也可以使用Domino 5,它同樣可以工作的很好。
參考資料
** 下載範例代碼:jndiExample.jar
** 訪問java.sun.com/products/jndi可以瞭解有關JNDI的最新情況,下載JNDI API。你還看看JNDI Tutorial : java.sun.com/products/jndi/tutorial/index.html。
** 關於LDAP,你可以訪問 LDAPman RFC 頁面來了解LDAP RFC。在developer works上,你還可以找到一篇關於如何構建LDAP地址本的教學:http://www-900.ibm.com/developer ... tutorial/index.html

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章