使用JAVA获取LDAP服务器上全球地址簿
2015-01-02王志远
王志远
(中欧国际工商学院,上海 201206)
0 前言
在开发一款用户针对学校的职工和师生的软件中,被要求实现一个比较有趣的需求。客户希望软件能实现对Outlook全球地址簿中人员信息的同步获取。通过这样的接口进行信息对接以后,配合以CRM系统的数据同步,一定程度上就能增强的学校内部各类人员信息的控制和管理。加强学校信息平台的基础搭建,最直接的便是方便了人员之间、人员和部门组织的交流。这样拥有云特征的通讯簿是具备“互联网+”时代特征的,并且是人们所需要的。像许多软件拥有比较良好的软件生态一样,这样做表明软件正在向这一良好趋势靠近。
在JAVA中有原生的API可以实现对LDAP的访问。其实也有工具,比如LDAPTemplate。它是基于SPRING开发的,虽然这个开源框架的操作方法和SPRING的JDBCTEMPLETE很相似,同时也传承了前者的一定的复杂性,更重要的是,由于一些IDE之间的支持上的问题,加上笔者对原生的API更加青睐。JNDI(命名和目录访问接口)将各种不同名字和目录服务的访问统一起来并且使用了相同的接口,这里就使用JNDI进行LDAP服务器的连接认证以及一些个人信息的读取。这样也更具通用性,也不需要特别的去下载一些JAR包。
1 初始化上下文,选择服务提供源
这其实有点像利用JNDI建立数据库的连接,Web开发的编程人员一定会很熟悉。创建一个环境变量的集合,其实是一个Hashtable,用以存放服务提供者的名字以及一些环境属性。其中的“com.sun.jndi.ldap.LdapCtxFactory”为 sun 的文件服务提供者。
Hashtable HashEnv= new Hashtable()
2 初始化上下文所需要的信息
这些信息会通过环境属性传递给服务提供者,也就是前面提到的。这些信息包括LDAP服务器的位置,以及认证信息。当然不同目录的客户端需要的连接信息会有所不同。
然后是初始化上下文。将之前构造的结构以参数形式传入。到这里如果一切顺利正常的话也完成了一个简单的连接认证。为 了 使 用 DirContext 对 象 , 要 导 入 javax.naming.directory.DirContext。
DirContextctx= new InitialDirContext(env)
3 对联系人数据进行收集
首先要创建查询对象控制器(Search Controls),并设置查询边界(Search Scope),增加搜索过滤器(Search Filter)设定针对用户个人信息进行查询,然后设置搜索节点并定制返回属性。
4 查询结果
调用 DirContext.search()查询上下文“OU= MultiShareDrives”中匹配的条目。最后对返回的NamingEnumeration对象进行遍历。其中也可以通过thumbnailPhoto的属性值,寻找到相应的内容,以文件输出流的形式生成图片文件,以此可以获取联系人的头像信息。
searchCtls.setReturningAttributes(returnedAtts);
NamingEnumeration answer= ctx.search(searchBase,searchFilter,searchCtls);
while (answer.hasMore()) {
SearchResultsr= (SearchResult)answer.next();
System.out.println(">>>"+ sr.getName());
printAttrs(sr.getAttributes());}
5 结语
以上介绍了通过JAVA获取LDAP服务器上AD的信息。当然JAVA提供了丰富的API,可以进行不仅仅如上所论述的简单查询,通过API同样可以对AD信息进行增加删除修改等操作。通过这些方法,能让软件系统与LDAP服务器更好的无缝对接,增强软件的实用性,更加有助于拓宽管理者的思路。
[1]张少敏,史占成,郭雅薇,等.改进的LDAP服务体系及其在电力系统PKI中的应用[J].继电器,2008,36(8):73-75.
[2]常潘,沈富可.基于 LDAP的校园网统一身份认证的实现[J].计算机工程,2007,33(5):281-282.
[3]任军.基于 LDAP 的目录服务综述[J].计算机应用研究,2005,22(5):8-10.
[4]陆吉仓,杨蒙,杨耀景.Active Directory在信息化管理中的应用与研究[J].中国信息化,2013(14).
[5]许峰.基于 Active Directory 的电台制播网组建、管理模式[J].西部广播电视,2013(10).
[6]赵天海,沈钧毅,齐勇,等.基于 JNDI的高可靠命名服务的研究[J].计算机工程,2006,32(6).