摘要: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。
为什么目录服务如此重要
随着企业中应用程序的增加,我们不得不面对日益增长的各类用户数据。这些用户数据分布在企业各处,带来了很大管理和维护上的麻烦。为了解决这个问题,我们通常需要在企业中构建标准的目录基础设施。同时,在实施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。