偶做的一个项目是使用LDAP(Lightweight Directory Access Protocol)服务器进行用户认证,而对于新用户还需要从LDAP服务器上获取当前用户的所有基本信息(姓,名,电子邮箱等),关于如何从LDAP上获取数据,本文就不讲了,因为网上很多文章讲这个,本文主要想讲一下如何从WAS(WebSphere Application Server)上动态获取LDAP服务器主机名称和端口号。
进入正文前,我首先想提出两个问题:
1. 为什么需要动态获取?
因为在测试服务器上用的是测试LDAP服务器,而生产服务器上是生产LDAP服务器。两个服务的主机名不一样,有时甚至端口也不一样。
所以在连接LDAP时,需要用不同的LDAP服务器主机名称和端口号。
在我提供这个方案之前,我们这个项目一直都是采用将LDAP服务器名称和端口号存储在一个属性文件中,但我们需要在测试与生产两个环境中提供不同的属性文件。因此使我们最终提供的部署文件不是很独立。每次往生产服务器上发布时都需要特别小心地更改这个配置文件。有时候很容易搞错。
2. 为什么可以从WAS上获取?
要使用LDAP服务器来进行用户认证,必须要在WAS administration console 上配置所使用的LDAP服务器主机名和端口号。这样我们就可以直接从WAS上获取到LDAP服务器主机名称和端口号。这样就不需要配置文件了,当然更不需要人为地做任何更改,完全实现了部署文件的独立性。即测试服务器与生产服务器使用相同的包。
以下是我在实现这个解决方案时所用的代码:
package org.brad.woo.ladp;
import java.io.File;
import java.util.*;
import javax.naming.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
public class LDAPHelper {
private final static String LDAP_HOST_PREFIX="ldap://";
private final static String LDAP_SSL_PORT="636";
private static Hashtable env = null;
static{
env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
String ldapHost = null;
String ldapPort = null;
try {
System.out.println("LDAPHelper - begin to parse ldap info");
System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
StringBuffer tempPath=new StringBuffer();
tempPath.append(new File(".").getAbsolutePath());
tempPath.append("/config/cells/");
File tempDirectory=new File(tempPath.toString());
if(tempDirectory.exists()&&tempDirectory.list()[0]!=null){
tempPath.append(tempDirectory.list()[0]);
tempPath.append("/security.xml");
File file = new File(tempPath.toString());
if(file.exists()){
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(file);
doc.getDocumentElement().normalize();
NodeList nodeLst = doc.getElementsByTagName("hosts");
Node fstNode = nodeLst.item(0);
if (fstNode.getNodeType() == Node.ELEMENT_NODE) {
Element fstElmnt = (Element) fstNode;
ldapHost = fstElmnt.getAttribute("host");
System.out.println("LDAPHelper - ldapHost : " + ldapHost);
ldapPort = fstElmnt.getAttribute("port");
System.out.println("LDAPHelper - ldapPort : " + ldapPort);
}
}
}
System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
System.out.println("LDAPHelper - end to parse ldap info");
} catch (Exception e) {
e.printStackTrace();
}
env.put(Context.PROVIDER_URL, LDAP_HOST_PREFIX+ldapHost+":"+ldapPort);
if(ldapPort.equals(LDAP_SSL_PORT)){
env.put("java.naming.ldap.derefAliases", "never");
env.put("java.naming.ldap.version", "3");
env.put(Context.REFERRAL, "follow");
env.put("java.naming.ldap.referral;.bind", "true");
env.put(Context.SECURITY_PROTOCOL, "ssl");
}
}
}
分享到:
相关推荐
LDAP服务器的配置
关于如何在Linux上搭建LDAP服务器
LDAP全称是一个轻量级的目录访问协议,它是建立在TCP/IP基础之上的用来查询和修改目录服务的。这是照着wiki翻译的,但是有人要问了什么是directory Service(目录服务)? 按照wiki的说法的话讲:在软件行业,目录就...
在企业范围内实现 LDAP 可以让运行在几乎所有计算机平台上的 所有的应用程序从 LDAP 目录中获取信息。LDAP 目录中可以存储各种类型的数据:电子 邮件地址、邮件路由信息、人力资源数据、公用密匙、联系人列表,等等...
LDAP服务器资料,很值得去好好学习,很经典的一个资料
将 LDIF 文件导入 LDAP 服务器.txt
开放的windows下的LDAP(轻量级的目录处理)服务器,性能很好哦。
这是一个可以登录ldap服务器并取出想要的结果 的一个简单例子。..
LDAP(Lightweight Directory Access Protocol, 轻量级目录访问协议),是一个用于访问目录数据 (特指 X.500 目录模型,笔者并不了解此协议) 的轻量级协议。本文介绍架设 ldap 服务器的一些知识。
在Linux上建立LDAP服务器 建立LDAP的过程
图解使用Domino建立LDAP服务器的过程
LDAP服务器配置(协议+服务器+客户机+管理+安全)
一个使用Delphi连接LDAP服务器的控件及代码。仅供学习。
Linux服务器搭建之十四:LDAP服务器 Linux操作系统平台:Xubuntu 用户:root 主要软件包:slapd, ldap-utils ,db-util,phpldapadmin ,apache2 LDAP服务器搭建流程: 我没有选择Fedora 14系统,原因是:安装成功了...
LDAP理解与应用
直接照搬操作,实现在debian服务器上成功搭建ldap服务器,搭建时一些注意实现都有红色字体表明。
LDAP服务器搭建 详细的介绍了Centos系统下的LDAP服务的搭建和管理
关于LDAP的概念随便网上有很多,我不想重复,这里只是说一下我自己的理解。 都说它是“轻量级目录协议”,太专业,我不懂,我只把它想象成“简单”的目录协议。 几个很重要的概念,以后会用到: dn :一条记录的位置...
CentOS 安装 LDAP 服务器 http://www.ossez.com/forum.php?mod=viewthread&tid=15509&fromuid=426