摘要: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。