使用Java操作LDAP案例

作者:chenhaozjnubit 分类: 发布于:2017-7-12 8:49 ė1474次浏览 61条评论

1 案例描述

公司平台使用LDAP来储存企业或用户的信息,在系统的运行过程中需要对LDAP存储的信息进行相关的访问和操作,那么在Java中是如何操作LDAP的呢?

2 案例分析

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。

3 解决过程

3.1 准备

1、Java客户端API(UnboundID LDAP SDK for Java)

下载地址 http://sourceforge.net/projects/ldap-sdk/files/

2、LDAP客户端(Apache Directory Studio)

下载地址 http://directory.apache.org/studio/

3.2 定义参数

Java代码  收藏代码

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

3.3 建立连接

Java代码  收藏代码

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

3.4 创建数据

1、创建DC对象

Java代码  收藏代码

  1. /** 创建DC */  
  2. public static void createDC(String baseDN, String dc) {  
  3.     String entryDN = "dc=" + dc + "," + baseDN;  
  4.     try {  
  5.         // 连接LDAP  
  6.         openConnection();  
  7.           
  8.         SearchResultEntry entry = connection.getEntry(entryDN);  
  9.         if (entry == null) {  
  10.             // 不存在则创建  
  11.             ArrayList<Attribute> attributes = new ArrayList<Attribute>();  
  12.             attributes.add(new Attribute("objectClass", "top", "organization", "dcObject"));  
  13.             attributes.add(new Attribute("dc", dc));  
  14.             attributes.add(new Attribute("o", dc));  
  15.             connection.add(entryDN, attributes);  
  16.             System.out.println("创建DC" + entryDN + "成功!");  
  17.         } else {  
  18.             System.out.println("DC " + entryDN + "已存在!");  
  19.         }  
  20.     } catch (Exception e) {  
  21.         System.out.println("创建DC出现错误:\n" + e.getMessage());  
  22.     }  
  23. }  

2、创建组织

Java代码  收藏代码

  1. /** 创建组织 */  
  2. public static void createO(String baseDN, String o) {  
  3.     String entryDN = "o=" + o + "," + baseDN;  
  4.     try {  
  5.         // 连接LDAP  
  6.         openConnection();  
  7.           
  8.         SearchResultEntry entry = connection.getEntry(entryDN);  
  9.         if (entry == null) {  
  10.             // 不存在则创建  
  11.             ArrayList<Attribute> attributes = new ArrayList<Attribute>();  
  12.             attributes.add(new Attribute("objectClass", "top", "organization"));  
  13.             attributes.add(new Attribute("o", o));  
  14.             connection.add(entryDN, attributes);  
  15.             System.out.println("创建组织" + entryDN + "成功!");  
  16.         } else {  
  17.             System.out.println("组织" + entryDN + "已存在!");  
  18.         }  
  19.     } catch (Exception e) {  
  20.         System.out.println("创建组织出现错误:\n" + e.getMessage());  
  21.     }  
  22. }  

3、创建组织单元

Java代码  收藏代码

  1. /** 创建组织单元 */  
  2. public static void createOU(String baseDN, String ou) {  
  3.     String entryDN = "ou=" + ou + "," + baseDN;  
  4.     try {  
  5.         // 连接LDAP  
  6.         openConnection();  
  7.           
  8.         SearchResultEntry entry = connection.getEntry(entryDN);  
  9.         if (entry == null) {  
  10.             // 不存在则创建  
  11.             ArrayList<Attribute> attributes = new ArrayList<Attribute>();  
  12.             attributes.add(new Attribute("objectClass", "top", "organizationalUnit"));  
  13.             attributes.add(new Attribute("ou", ou));  
  14.             connection.add(entryDN, attributes);  
  15.             System.out.println("创建组织单元" + entryDN + "成功!");  
  16.         } else {  
  17.             System.out.println("组织单元" + entryDN + "已存在!");  
  18.         }  
  19.     } catch (Exception e) {  
  20.             System.out.println("创建组织单元出现错误:\n" + e.getMessage());  
  21.     }  
  22. }  

4、创建用户

Java代码  收藏代码

  1. /** 创建用户 */  
  2. public static void createEntry(String baseDN, String uid) {  
  3.     String entryDN = "uid=" + uid + "," + baseDN;  
  4.     try {  
  5.         // 连接LDAP  
  6.         openConnection();  
  7.           
  8.         SearchResultEntry entry = connection.getEntry(entryDN);  
  9.         if (entry == null) {  
  10.             // 不存在则创建  
  11.             ArrayList<Attribute> attributes = new ArrayList<Attribute>();  
  12.             attributes.add(new Attribute("objectClass", "top", "account"));  
  13.             attributes.add(new Attribute("uid", uid));  
  14.             connection.add(entryDN, attributes);  
  15.             System.out.println("创建用户" + entryDN + "成功!");  
  16.         } else {  
  17.             System.out.println("用户" + entryDN + "已存在!");  
  18.         }  
  19.     } catch (Exception e) {  
  20.         System.out.println("创建用户出现错误:\n" + e.getMessage());  
  21.     }  
  22. }  

3.5 修改数据

Java代码  收藏代码

  1. /** 修改用户信息 */  
  2. public static void modifyEntry(String requestDN, Map<String,String> data) {  
  3.     try {  
  4.         // 连接LDAP  
  5.         openConnection();  
  6.           
  7.         SearchResultEntry entry = connection.getEntry(requestDN);  
  8.         if (entry == null) {  
  9.             System.out.println(requestDN + " user:" + requestDN + " 不存在);  
  10.             return;  
  11.         }  
  12.         // 修改信息  
  13.         ArrayList<Modification> md = new ArrayList<Modification>();  
  14.         for(String key : data.keySet()) {  
  15.             md.add(new Modification(ModificationType.REPLACE, key, data.get(key)));  
  16.         }  
  17.         connection.modify(requestDN, md);  
  18.   
  19.         System.out.println("修改用户信息成!");  
  20.     } catch (Exception e) {  
  21.         System.out.println("修改用户信息出现错误:\n" + e.getMessage());  
  22.     }  
  23. }  

3.6 删除数据

Java代码  收藏代码

  1. /** 删除用户信息 */  
  2. public static void deleteEntry(String requestDN) {  
  3.     try {  
  4.         // 连接LDAP  
  5.         openConnection();  
  6.           
  7.         SearchResultEntry entry = connection.getEntry(requestDN);  
  8.         if (entry == null) {  
  9.             System.out.println(requestDN + " user:" + requestDN + "不存在");  
  10.             return;  
  11.         }  
  12.         // 删除  
  13.         connection.delete(requestDN);  
  14.         System.out.println("删除用户信息成!");  
  15.     } catch (Exception e) {  
  16.         System.out.println("删除用户信息出现错误:\n" + e.getMessage());  
  17.     }  
  18. }  

3.7 查询数据

Java代码  收藏代码

  1. /** 查询 */  
  2. public static void queryLdap(String searchDN, String filter) {  
  3.     try {  
  4.         // 连接LDAP  
  5.         openConnection();  
  6.           
  7.         // 查询企业所有用户  
  8.         SearchRequest searchRequest = new SearchRequest(searchDN, SearchScope.SUB, "(" + filter + ")");  
  9.         searchRequest.addControl(new SubentriesRequestControl());  
  10.         SearchResult searchResult = connection.search(searchRequest);  
  11.         System.out.println(">>>共查询到" + searchResult.getSearchEntries().size() + "条记录");  
  12.         int index = 1;  
  13.         for (SearchResultEntry entry : searchResult.getSearchEntries()) {  
  14.             System.out.println((index++) + "\t" + entry.getDN());  
  15.         }  
  16.     } catch (Exception e) {  
  17.         System.out.println("查询错误,错误信息如下:\n" + e.getMessage());  
  18.     }  
  19. }  

3.8 测试代码

Java代码  收藏代码

  1. public static void main(String[] args) {  
  2.     String root = "com";  
  3.     String dc = "truesens";  
  4.     String o = "kedacom";  
  5.     String ou = "people";  
  6.     String uid = "admin";  
  7.     String filter = "objectClass=account";  
  8.   
  9.     createDC("dc=" + root, dc);  
  10.     createO("dc=" + dc + ",dc=" + root, o);  
  11.     createOU("o=" + o + ",dc=" + dc + ",dc=" + root, ou);  
  12.     createEntry("ou=" + ou + ",o=" + o + ",dc=" + dc + ",dc=" + root, uid);  
  13.     queryLdap("ou=" + ou + ",o=" + o + ",dc=" + dc + ",dc=" + root, filter);  
  14.       
  15.     HashMap<String,String> data = new HashMap<String,String>(0);  
  16.     data.put("userid", uid);  
  17. modifyEntry("uid="+uid+",ou="+ou+",o="+o+",dc="+dc+",dc="+root, data);  
  18.       
  19.     deleteEntry("uid="+uid+",ou="+ou + ",o="+o+",dc=" + dc + ",dc=" + root);  
  20.     queryLdap("ou=" + ou + ",o=" + o + ",dc=" + dc + ",dc=" + root, filter);  
  21. }  

4 解决结果

1、输出结果

Java代码  收藏代码

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

2、使用LDAP客户端Apache Directory Studio连接LDAP服务查看LDAP数据,如下图所示

5 总结

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

本文出自 爱奕乐,转载时请注明出处及相应链接。

分享本文至:

评论

  1. 一湖漂泊 2019-07-05 17:01 回复

    请问楼主,UnboundID LDAP SDK for Java用的是哪个版本呀,感谢!!!

发表评论

电子邮件地址不会被公开。必填项已用*标注