Lotus的JAVA與DOMINO通過LDAP整合方法!
來源:互聯網
上載者:User
摘要: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。