使用Java操作LDAP案例

[size=x-large][b]1 案例描述[/b][/size]
公司平台使用LDAP来储存企业或用户的信息,在系统的运行过程中需要对LDAP存储的信息进行相关的访问和操作,那么在Java中是如何操作LDAP的呢?

[size=x-large][b]2 案例分析[/b][/size]
LDAP是一个得到关于人或者资源的集中、静态数据的快速方式,是一种存储模式和访问协议。
UnboundID LDAP SDK for Java是一个快速、综合易用的 LDAP 目录服务的 Java 客户端API,它提供了一套快速、强大、用户友好并且开源的Java API来与LDAP目录服务器交互,可读写 LDIF、使用BASE64 和 ASN.1 BER 进行编码解码,支持安全通信等特性,要求 Java 1.5 或者更新版本支持,同时也支持 Android 平台。与其它基于Java的LDAP APIs相比,它具有更好的性能、更易于使用,功能更多,而且还是唯一一个不断有活跃开发和增强的SDK。
在软件开发中,对数据的操作无非就是增加、删除、修改、查询等4种操作,对LDAP的操作也一样。下面我们一起探讨在Java中如何使用UnboundID LDAP SDK操作LDAP。

[size=x-large][b]3 解决过程[/b][/size]
[size=large][b]3.1 准备[/b][/size]
[b]1、Java客户端API(UnboundID LDAP SDK for Java)[/b]
下载地址 http://sourceforge.net/projects/ldap-sdk/files/

[b]2、LDAP客户端(Apache Directory Studio)[/b]
下载地址 http://directory.apache.org/studio/

[size=large][b]3.2 定义参数[/b][/size]

// 当前配置信息
private static String ldapHost = "172.16.160.196";
private static int ldapPort = 389;
private static String ldapBindDN = "cn=manager,dc=com";;
private static String ldapPassword = "******";
private static LDAPConnection connection = null;

[size=large][b]3.3 建立连接[/b][/size]

/** 连接LDAP */
public static void openConnection() {
if (connection == null) {
try {
connection = new LDAPConnection(ldapHost, ldapPort, ldapBindDN, ldapPassword);
} catch (Exception e) {
System.out.println("连接LDAP出现错误:\n" + e.getMessage());
}
}
}

[size=large][b]3.4 创建数据[/b][/size]
[b]1、创建DC对象[/b]

/** 创建DC */
public static void createDC(String baseDN, String dc) {
String entryDN = "dc=" + dc + "," + baseDN;
try {
// 连接LDAP
openConnection();

SearchResultEntry entry = connection.getEntry(entryDN);
if (entry == null) {
// 不存在则创建
ArrayList<Attribute> attributes = new ArrayList<Attribute>();
attributes.add(new Attribute("objectClass", "top", "organization", "dcObject"));
attributes.add(new Attribute("dc", dc));
attributes.add(new Attribute("o", dc));
connection.add(entryDN, attributes);
System.out.println("创建DC" + entryDN + "成功!");
} else {
System.out.println("DC " + entryDN + "已存在!");
}
} catch (Exception e) {
System.out.println("创建DC出现错误:\n" + e.getMessage());
}
}

[b]2、创建组织[/b]

/** 创建组织 */
public static void createO(String baseDN, String o) {
String entryDN = "o=" + o + "," + baseDN;
try {
// 连接LDAP
openConnection();

SearchResultEntry entry = connection.getEntry(entryDN);
if (entry == null) {
// 不存在则创建
ArrayList<Attribute> attributes = new ArrayList<Attribute>();
attributes.add(new Attribute("objectClass", "top", "organization"));
attributes.add(new Attribute("o", o));
connection.add(entryDN, attributes);
System.out.println("创建组织" + entryDN + "成功!");
} else {
System.out.println("组织" + entryDN + "已存在!");
}
} catch (Exception e) {
System.out.println("创建组织出现错误:\n" + e.getMessage());
}
}

[b]3、创建组织单元[/b]

/** 创建组织单元 */
public static void createOU(String baseDN, String ou) {
String entryDN = "ou=" + ou + "," + baseDN;
try {
// 连接LDAP
openConnection();

SearchResultEntry entry = connection.getEntry(entryDN);
if (entry == null) {
// 不存在则创建
ArrayList<Attribute> attributes = new ArrayList<Attribute>();
attributes.add(new Attribute("objectClass", "top", "organizationalUnit"));
attributes.add(new Attribute("ou", ou));
connection.add(entryDN, attributes);
System.out.println("创建组织单元" + entryDN + "成功!");
} else {
System.out.println("组织单元" + entryDN + "已存在!");
}
} catch (Exception e) {
System.out.println("创建组织单元出现错误:\n" + e.getMessage());
}
}

[b]4、创建用户[/b]

/** 创建用户 */
public static void createEntry(String baseDN, String uid) {
String entryDN = "uid=" + uid + "," + baseDN;
try {
// 连接LDAP
openConnection();

SearchResultEntry entry = connection.getEntry(entryDN);
if (entry == null) {
// 不存在则创建
ArrayList<Attribute> attributes = new ArrayList<Attribute>();
attributes.add(new Attribute("objectClass", "top", "account"));
attributes.add(new Attribute("uid", uid));
connection.add(entryDN, attributes);
System.out.println("创建用户" + entryDN + "成功!");
} else {
System.out.println("用户" + entryDN + "已存在!");
}
} catch (Exception e) {
System.out.println("创建用户出现错误:\n" + e.getMessage());
}
}

[size=large][b]3.5 修改数据[/b][/size]

/** 修改用户信息 */
public static void modifyEntry(String requestDN, Map<String,String> data) {
try {
// 连接LDAP
openConnection();

SearchResultEntry entry = connection.getEntry(requestDN);
if (entry == null) {
System.out.println(requestDN + " user:" + requestDN + " 不存在);
return;
}
// 修改信息
ArrayList<Modification> md = new ArrayList<Modification>();
for(String key : data.keySet()) {
md.add(new Modification(ModificationType.REPLACE, key, data.get(key)));
}
connection.modify(requestDN, md);

System.out.println("修改用户信息成!");
} catch (Exception e) {
System.out.println("修改用户信息出现错误:\n" + e.getMessage());
}
}

[size=large][b]3.6 删除数据[/b][/size]

/** 删除用户信息 */
public static void deleteEntry(String requestDN) {
try {
// 连接LDAP
openConnection();

SearchResultEntry entry = connection.getEntry(requestDN);
if (entry == null) {
System.out.println(requestDN + " user:" + requestDN + "不存在");
return;
}
// 删除
connection.delete(requestDN);
System.out.println("删除用户信息成!");
} catch (Exception e) {
System.out.println("删除用户信息出现错误:\n" + e.getMessage());
}
}

[size=large][b]3.7 查询数据[/b][/size]

/** 查询 */
public static void queryLdap(String searchDN, String filter) {
try {
// 连接LDAP
openConnection();

// 查询企业所有用户
SearchRequest searchRequest = new SearchRequest(searchDN, SearchScope.SUB, "(" + filter + ")");
searchRequest.addControl(new SubentriesRequestControl());
SearchResult searchResult = connection.search(searchRequest);
System.out.println(">>>共查询到" + searchResult.getSearchEntries().size() + "条记录");
int index = 1;
for (SearchResultEntry entry : searchResult.getSearchEntries()) {
System.out.println((index++) + "\t" + entry.getDN());
}
} catch (Exception e) {
System.out.println("查询错误,错误信息如下:\n" + e.getMessage());
}
}

[size=large][b]3.8 测试代码[/b][/size]

public static void main(String[] args) {
String root = "com";
String dc = "truesens";
String o = "kedacom";
String ou = "people";
String uid = "admin";
String filter = "objectClass=account";

createDC("dc=" + root, dc);
createO("dc=" + dc + ",dc=" + root, o);
createOU("o=" + o + ",dc=" + dc + ",dc=" + root, ou);
createEntry("ou=" + ou + ",o=" + o + ",dc=" + dc + ",dc=" + root, uid);
queryLdap("ou=" + ou + ",o=" + o + ",dc=" + dc + ",dc=" + root, filter);

HashMap<String,String> data = new HashMap<String,String>(0);
data.put("userid", uid);
modifyEntry("uid="+uid+",ou="+ou+",o="+o+",dc="+dc+",dc="+root, data);

deleteEntry("uid="+uid+",ou="+ou + ",o="+o+",dc=" + dc + ",dc=" + root);
queryLdap("ou=" + ou + ",o=" + o + ",dc=" + dc + ",dc=" + root, filter);
}


[size=x-large][b]4 解决结果[/b][/size]
[b]1、输出结果[/b]

创建代理商dc=truesens,dc=com成功!
创建组织o=kedacom,dc=truesens,dc=com成功!
创建组织单元ou=people,o=kedacom,dc=truesens,dc=com成功!
创建用户uid=admin,ou=people,o=kedacom,dc=truesens,dc=com成功!
>>>共查询到1条记录
1 uid=admin,ou=people,o=kedacom,dc=truesens,dc=com
修改用户信息成功!
删除用户信息成功!
>>>共查询到0条记录


2、使用LDAP客户端Apache Directory Studio连接LDAP服务查看LDAP数据,如下图所示
[img]http://dl.iteye.com/upload/attachment/0070/2165/cc2d3c40-9226-3c42-8a4a-cc1f7b6a4d27.png[/img]

[size=x-large][b]5 总结[/b][/size]
从解决过程和解决结果,我们可知在Java中使用UnboundID LDAP SDK for Java所提供的API来操作LDAP,实现对LDAP数据进行增加、修改、删除、查询都很简单和易用。

[size=x-large][b]6 源代码[/b][/size]
完整测试代码请查看下面附件
[url=http://dl.iteye.com/topics/download/b213ae6f-1752-3ecd-b397-0f05b13d495b]完整代码点击这里下载[/url]
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值