Java对LDAP的操作方法

来源:百度文库 编辑:神马文学网 时间:2024/05/23 14:15:03
最近因为项目需要,研究了下大名久仰的LDAP。它以目录树结构存放数据信息,和数据库以表结构存放数据不同。网络上关于LDAP的介绍很多,不是本文的重点。作为程序员,最关心的就是如何写程序去访问和操作LDAP数据,这也是本文所要讨论的,但是局限于java程序。
一.JNDI(JAVA 命名及目录接口)
JNDI是JAVA为命名及目录服务访问制定的基础接口标准,用于访问包括DNS,NIS,LDAP,文件系统等任何以树目录形式存在目标对象,并且基本上可保持访问方式的一致(意味着代码共用)。对于不同的目录类型,JNDI通过使用不同的目录驱动,以保证访问方式的一致。以下连接可获得较详细的讲解和例程:http://java.sun.com/products/jndi/tutorial/。经常使用的LDAP驱动有JDK自带的LDAP provider,还有IBM的PROVIDER,以及NOVEL的JNDI产品。
二.jldap
JLDAP是由Novell开发的,原是针对Novel的NDS目录设计的JAVA访问工具。NOVEL的NDS和网景(NETSCAPE)的目录是工具界最早的目录产品。JLDAP并非JNDI的服务供应者,而是同一抽象层次下的访问工具集。与JNDI-LDAP相比,JLDAP更接近于类关系数据库的访问方式。NDS是遵守LDAP协议的并进行了扩展的类MAD产品。而NOVEL也已把JLDAP捐献给了OPENLDAP开源项目,可以世界范围内自由使用。与JNDI相比,JLDAP无须继承DirContext才能实现添加,也无需预先生成添加的类,可以象普通数据访问那样,生成连接,然后使用add方法添加。这样,添加的灵活性要强于JNDI。
三.JdbcLDAP驱动
网络上有2种形式的jdbc-Ldap驱动程序,提供以sql的语法访问ldap数据库。
1.OcterString的开源驱动
http://www.openldap.org/jdbcldap/提供下载。但是由于2005年11月被OERACLE并购,网络上难以找到相关的资料,唯一可以参考的资料是其所带的JDBC-LDAP Getting Started.pdf文档。最初的1.0版本在连接时会有错误抛出,却可以正常执行sql操作。通过自己编译source可以得到较高的版本(难以找到最新版本的jar包),此版本可以正常使用。值得注意的是,在文档中,关于删除操作的ps.excute(SQL)有问题,应该改成ps.excute(),不应该带参数,因为delete操作不会返回结果,否则会产生空指针异常(NullPointerException)。实际上,这个驱动引用了上面提到的jldap类库。在使用过程中,发现了本驱动的一些bug。
其一,查询结果集比实际数据多一条NULL的记录,所以在取数据时的循环判断要追加其它条件;
其二,查询记录后,会采用Base64的算法对数据进行压缩,但是对中文字符处理后会产生失真现象。需要更改com.octetstring.jdbcLdap.jndi.UnpackResults.java源代码。文件中对查询结果进行了Base64.encode()的处理。而Base64是由novell提供的ldap.jar包中的com.novell.ldap.util.Base64.java类。去除Base64的处理并进行适当的更改,能够正常显示中文。根据novell的ldap.jar包的API文档,Base64处理用于转换字符流为不可直接识别的字节码,并且转换后的数据量只有转换之前的33%,节省了空间,提高了效率,但是对CJK文本的转换会失真。
另外,由于使用了jdbcldap驱动,考虑把LDAP数据库的节点映射为一个表,把节点属性作为表项,采用Hibernate框架进行数据操作,这种思想在做现存的Hibernate框架实现的系统转LDAP单点登录时,是一种理想方案。实际上,这样的映射可行,但是由于没有合适的Hibernate Dialect方言,转换出来的SQL操作无法正常执行。这种方案需要自行实现一个合适的Hibernate Dialect类。
2.Novell的jdbcldap驱动
http://developer.novell.com/ndk/ldapjdbc.htm,Novell提供的专用于它的eDirectory产品的驱动,只提供了查询操作。
欢迎访问 风卷流云 的blog
http://spaces.msn.com/fangchengying/
转载请保留出处!