LDAP开发小结

写在前面

由于最近的一个项目的需求是要是需要读取AD域里面的一些数据,然后保存到数据库中,所以对LDAP这个东西进行了一些研究。

感谢以下链接提供的资料 :

http://wibiline.iteye.com/blog/1840739

http://aa00aa00.iteye.com/blog/1276936

http://www.cnblogs.com/forbreak/archive/2012/10/30/2746464.html

http://cgs1999.iteye.com/blog/1574635

http://www.cnblogs.com/awpatp/archive/2010/02/14/1668097.html

项目需求

已知一个节点 "CN=Authorization2,CN=Program Data Test,DC=cayzlh,DC=com",需要得到节点下的某个节点里面的相关属性,然后提取出来,保存到数据库中。

解决问题

  1. 获得LDAP连接

    1. public class LdapADHelper {
    2.    private final String URL = "ldap://"+"192.168.1.204:389";
    3.    private final String ADMINNAME = "[email protected]";
    4.    private final String ADMINPASSWORD = "test123";
    5.    private LdapContext ctx = null;
    6.  
    7.    public static LdapADHelper getInstance() throws NamingException{
    8.       return new LdapADHelper();
    9.  
    10.    }
    11.    private LdapADHelper () throws NamingException {
    12.       this.initLdap();
    13.    }
    14.    /**
    15.     * 初始化ldap
    16.     * @throws NamingException
    17.     */
    18.    private void initLdap() throws NamingException {
    19.       // ad服务器
    20.       Hashtable<String, String> HashEnv = new Hashtable<String, String>();
    21.       HashEnv.put(Context.SECURITY_AUTHENTICATION, "simple"); // LDAP访问安全级别
    22.       HashEnv.put(Context.SECURITY_PRINCIPAL, this.ADMINNAME); // AD User
    23.       HashEnv.put(Context.SECURITY_CREDENTIALS, this.ADMINPASSWORD); // AD Password
    24.       HashEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); // LDAP工厂类
    25.       HashEnv.put(Context.PROVIDER_URL, this.URL);
    26.       try {
    27.          ctx = new InitialLdapContext(HashEnv, null);
    28.          System.out.println("初始化ldap成功!");
    29.       } catch (NamingException e) {
    30.          e.printStackTrace();
    31.          System.err.println("Throw Exception : " + e);
    32.          throw e;
    33.       }
    34.    }
    35.    ....
    36. }

在外部类中调用这个类的getInstance()方法则可以得到helper对象并初始化好了LdapContext对象

  1. 查询对象属性

    1. try {
    2.    // 域节点
    3.    String searchBase = this.getBaseDnForRoleObject("CN=角色1,CN=RoleObjectDemo2,CN=msDS-AzApplicationTest2,CN=Authorization2,CN=Program Data Test,DC=cayzlh,DC=com");
    4.    // LDAP搜索过滤器类
    5.    String searchFilter = "(cn=*)";
    6.    // 创建搜索控制器
    7.    SearchControls searchCtls = new SearchControls();
    8.    // 设置搜索范围
    9.    searchCtls.setSearchScope(SearchControls.ONELEVEL_SCOPE);
    10.    String returnedAtts[] = { "distinguishedName " }; // 定制返回属性, 这里只需要查询 角色1 这个对象的 distinguishedName 属性
    11.    searchCtls.setReturningAttributes(returnedAtts); // 设置返回属性集
    12.    // 不设置则返回所有属性
    13.    // 根据设置的域节点、过滤器类和搜索控制器搜索LDAP得到结果
    14.    NamingEnumeration<?> answer = ctx.search(searchBase, searchFilter, searchCtls);// Search
    15.  
    16.    while (answer.hasMoreElements()) {// 遍历结果集
    17.       // 得到符合搜索条件的DN
    18.       SearchResult sr = (SearchResult) answer.next();
    19.       // 得到符合条件的属性集
    20.       Attributes attrs = sr.getAttributes();
    21.       if (attrs != null) {
    22.          try {
    23.             if ( attrs.getAll().hasMore() ) {
    24.                Attribute attr = (Attribute) ne.next();// 得到下一个属性
    25.                System.out.println(attr.getAll().next().toString());
    26.                // 这里输出得到的就是 角色1 的distinguishedName 属性,如果要获取有多个值的属性, 则可以利用循环和next()方法来获取得到这个属性的所有值
    27.             }
    28.          } catch (NamingException e) {
    29.             e.printStackTrace();
    30.             System.err.println("Throw Exception : " + e);
    31.          }
    32.       }
    33.    }
    34. } catch (NamingException e) {
    35.    System.err.println("Throw Exception : " + e);
    36. }

工具

在开发过程中使用的工具是 ADSI编辑器在域服务中进行查看和编辑相应的属性。打开方式如图所示:

源代码

写了一份简单的demo,是web版的,也许有些问题,稍微改一下就可以了。又需要的可以下载来玩玩。。

下载地址:http://files.cnblogs.com/files/chenanyu/LdapTest.zip

好久好久没有发过博客,不足之处见谅。。

时间: 2024-10-10 13:23:44

LDAP开发小结的相关文章

iOS线程开发小结

/* 方法名决定是否开启新线程(async,sync),队列类型(全局队列,串行队列)决定开启多少条线程 1.快速线程调用 *开启后台线程执行任务 [self performSelectorInBackground:@selector(test) withObject:nil]; *回到主线程执行任务 [self performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES]; 2.GCD

PHP服务器文件管理器开发小结(总结):总结、索引和源代码

PHP服务器文件管理器的开发经过前一阶段的介绍基本完成了功能搭建,包括目录的检索.增加.删除.重命名,文件的增加.浏览.修改.重命名.移动,以及文件的上传和下载等功能.本文对前一阶段工作的相关博文进行索引,并提供源代码供有兴趣的同学一同讨论. PHP服务器文件管理器开发小结(一):功能规划 本节讨论了文件管理器的目标功能和运行环境. PHP服务器文件管理器开发小结(二):版面设计和css 本节讨论了页面布局所需的css内容,并介绍了引入jQuery和jQueryUI的方法. PHP服务器文件管理

XXX系统开发小结(SSH+Jquery EasyUI)

一.项目总体介绍 前一段时间的工作中,笔者大概用了两三个月开发了一个Web管理信息系统,使用的框架集为Struts2.3.1+Spring3.0+Hibernate3+Jquery EasyUI1.3.5,系统业务逻辑并不复杂,完成数据的采集(以问卷的形式).计算处理和形成报告发布.EasyUI是一个很优秀的JS UI框架,使用简单方便,效果也还可以,是UI效果和带宽速度之间的一个折中之选.系统中还有新闻发布模块,用到了富文本编辑器,在比较了很多插件之后,选择了kindeditor,原因很简单,

arcserver开发小结(三)

一.关于网络数据集的制作 由于要做实现网络分析的功能,而手中却没有网络数据集,关于网络数据集的制作,网上也有不少的资料.我参考的是ESRI为我们提供的帮助文档(Network_Analyst_Tutorial.pdf,该文档位于C:\Program Files\ArcGIS\Documentation,当然这个路径会随着ArcGIS安装路径的不同而有所不同),参照里面的做了下,我觉得最重要的是当你一步步NEXT后生成了.ND文件(网络数据集network dataset)之后,这里还没完,务必要

arcserver开发小结(一)

一.关于属性查询 由于要做属性查询,又重新玩起了arcmap中的select by attribute,有很多自己当初玩弄arcmap多年还不是很清楚的东西 1,字段名 (1)file geodatabase, shapefile, dBase table, coverage, INFO table-- "AREA" (2)personal geodatabase--[AREA] (3)ArcSDE geodatabase--AREA (4)Excel file (.xls file)

arcserver开发小结(二)

一.关于服务器上下文 1,服务器上下文(ServerContext)本质上是一个GIS服务器上的进程,它是服务器端编程的起点. 2,只有本地资源才能得到服务器上下文,通常得到服务器上下文的主线是: MapResourceLocal——>ServerContextInfo——>ServerContext 3,在gis服务器上创建对象,只能通过ServerContext的CreateObject方法,而不能用new关键字,new关键字创建的是在本机上创建,而非gis服务器上. 4,CreateOb

OneDrive模块开发小结(二)--- 性能及其他问题解决方案

继上篇OneDrive模块开发小结(一)--- 获取登陆时email http://blog.csdn.net/vic_fang/article/details/23282311 之后,再做一个阶段性小结 1. 关于同步方法和异步方法 onedrive的demon项目中提供了两种方式的api,以获取文件详细信息为例:get(String id), getAsync(String id, LiveOperationListener listener).get(String id)方式是纯异步的, 

redis开发小结

随着缓存在web服务中用的越来越广泛,redis可以说成为了目前最流行的NoSQL数据库!redis与memcached最大的不同在于redis支持更多的数据类型,包括string.hash.list.set.sorted list等,所以redis的发展非常迅速,很多公司已将memcached替换为redis.我也做了一些redis的开发,现做一些小结. 1. redis常用配置 daemonize no     //Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用

开发小结-流程管理类-下篇

改Bug和优化要不要同时进行 个人觉的,改Bug和优化,当优点的点和改Bug的点紧密相关联时时,改Bug和优化可以一同进行.而对于那些不怎么紧密的代码,优化可有可无时,那坚决不要优化.比方说,最开始进行释放内存,使用delete p; p = NULL;后来发现项目中已经有封装好宏,只需要一句话就可搞定.不过在使用该宏时,需要引入头文件.那么,这种情况下,就可以不进行优化,原来怎么写,现在就这么写.保持在同一个模块(.cpp)中,相关操作的一致性即可. 从冗余的实现到既可以满足业务功能,又保证每