文档章节

SpringLDAP-Reference (中文文档一)

追梦java
 追梦java
发布于 2014/06/09 10:48
字数 1687
阅读 67
收藏 3

序言

      Ldap jndi类似于sql编程用jdbc访问数据库,JDBC和JAVA LDAP之间有若干个相同点,虽然是两种完全不同的利弊权衡不同的API,但它们有着一些共有的特性

  *即使是最简单的任务,它们都需要大量的底层命令来处理
  *不管发生什么情况,程序必须要正确的关闭
  *异常处理困难
  
       以上的几点情况导致了APIS的普通使用中存在着大量的重复代码,正如我们都知道,重复代码是最严重的一个问题。总之,归结为java程序中的jdbc和ldap都难以置信地重复和落后。

      SpringJDBC是spring框架的一部分,它提供了简明的SQL程序接口,对于JAVA LDAP程序,我们需要一个与之类似的框架。

 

  
第一章 介绍

1.1概述

 SpringLDAP是一个简单的LDAP的Java编程库,建立在作为JdbcTemplate的SpringJDBC同样的原则,它完全无需 担心创建和关闭LdapContext和NamingEnumeration遍历,它还提供了一个更为全面的未经检查的异常层次结构,建立在Spring 的 DataAccessException 基础上, 附带的,它还提供了对属性的LDAP动态过滤器和DNS(DistinguishedNames),LDAP属性管理,客户端的LDAP事务管 理。
 设想,一个案例,一个方法要将一些person的属性搜索出来并存储在一个列表中返回,如果使用JDBC,我们需要建立一个连接,执行查询 语句。我们将循环结果集并检索我们需要的属性,将它放在一个列表中。相比之下,使用JAVA LDAP ,我们将建立一个上下文(CONTEXT)使用搜索过滤器执行搜索,循环结果集,检索我们需要的属性放在一个列表中。
 
 JAVA LDAP 对一个人的姓名查询的传统方式看起来像这样,具体执行方法为粗体部分。(代码间没空格,比较乱,建议对照英文文档)
 packagecom.example.dao;
publicclassTraditionalPersonDaoImplimplementsPersonDao{
publicListgetAllPersonNames(){
Hashtableenv=newHashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL,"ldap://localhost:389/dc=example,dc=com ");
DirContextctx;
try{
ctx=newInitialDirContext(env);
}catch(NamingExceptione){
thrownewRuntimeException(e);
}
LinkedListlist=newLinkedList();
NamingEnumerationresults=null;
try{
SearchControlscontrols=newSearchControls();
controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
results=ctx.search("","(objectclass=person)",controls);
while(results.hasMore()){
SearchResultsearchResult=(SearchResult)results.next();
Attributesattributes=searchResult.getAttributes();
Attributeattr=attributes.get("cn");
Stringcn=(String)attr.get();
list.add(cn);

}
}catch(NameNotFoundExceptione){
//Thebasecontextwasnotfound.
//Justcleanupandexit.
}catch(NamingExceptione){
thrownewRuntimeException(e);
}finally{
if(results!=null){
try{
results.close();
}catch(Exceptione){
//Nevermindthis.
}
}
if(ctx!=null){
try{
ctx.close();

}catch(Exceptione){
//Nevermindthis.
}
}
}
returnlist;
}
}

 

使用spring ldap的AttributesMapper和 LdapTemplate,我们可以用下列代码实现相同的功能

packagecom.example.dao;
publicclassPersonDaoImplimplementsPersonDao{
privateLdapTemplateldapTemplate;
publicvoidsetLdapTemplate(LdapTemplateldapTemplate){
this.ldapTemplate=ldapTemplate;
}
publicListgetAllPersonNames(){
returnldapTemplate.search(
"","(objectclass=person)",
newAttributesMapper(){
publicObjectmapFromAttributes(Attributesattrs)
throwsNamingException{
returnattrs.get("cn").get();
}
});
}
}

以上代码明显比传统方式更加节省了代码数量,LdapTemplate的搜索方法执行搜索,将属性信息放在一个字符串中放在AttributesMapper中,然后将它放在集合中返回。
需 要注意的是,这个PersonDaoImpl代码只是一个特定的简单实例,而不能用于任何地方,为此,Sping Ldap提供了一个set方法,There is nothing Spring-specific about this"Inversion of Control",
任何人都可以创建一个PersonDaoImpl实例,并注入LdapTemplate.不管如何,Spring提供了一个简 便容易的方法实现了它,Spring容器可以告诉一个实例与LdapTemplate的依赖关系,并将它注入到PersonDao实例中。定义方式有很多 种,通常采用XML方式

<beans>
<beanid="contextSource"class="org.springframework.ldap.core.support.LdapContextSource">
<propertyname="url"value="ldap://localhost:389"/ >
<propertyname="base"value="dc=example,dc=com"/>
<propertyname="userDn"value="cn=Manager"/>
<propertyname="password"value="secret"/>
</bean>
<beanid="ldapTemplate"class="org.springframework.ldap.core.LdapTemplate">
<constructor-argref="contextSource"/>
</bean>
<beanid="personDao"class="com.example.dao.PersonDaoImpl">
<propertyname="ldapTemplate"ref="ldapTemplate"/>
</bean>
</beans>

1.2包概述

至少,使用Spring Ldap你需要:
? spring-ldap-core (the SpringLDAP library)
? spring-core (内部公用类)
? spring-beans (操作Java Bean接口)
? commons-logging (a simple logging facade,used internally)
? commons-lang (misc utilities,used internally)

除了以上这些包,你还可能需要以下这些:
? spring-context (如果你要使用Spring上下文,采用一致的API增加对资源获取的能力,如果你有必要对BaseLdapPathBeanPostProcessor规划使用.)
? spring-tx (如果你需要使用客户端的补偿事务(compensating transaction)支持)
? spring-jdbc (如果你需要操作数据库)
? ldapbp (Sun Ldap增强包--如果你要使用Ldap V3标准且你没使用JAVA5或更高版本)
? commons-pool (如果你需要使用连接池功能)

1.3 包结构
本节提供了一个Spring Ldap包逻辑结构的示意图,包之间的依赖关系已经注明

(图插不上来,对照英文文档)
1.3.1.org.springframework.transaction.compensating
该包提供了通用的事务支持,这不同于LDAP-specific or JNDI-specific
*依赖关系:commons-logging

1.3.2.org.springframework.ldap
该包提供了异常处理库,这种uncheck层次的异常反映了NamingException的层次。
*依赖关系:spring-core

1.3.3.org.springframework.ldap.core
该包包含了开发的核心接口,这些接口包括 AuthenticationSource,ContextSource,DirContextProcessor,和 NameClassPairCallbackHandler,而且包含了class LdapTemplate核心,加上各种映射及执行代码
*依赖关系:ldap,ldap.support,spring-beans,spring-core,spring-tx,commons-lang,commons-logging

1.3.4.org.springframework.ldap.core.support
该包提供了接口实现的核心部分
*依赖关系:ldap,ldap.core,ldap.support,spring-core,spring-beans,spring-context,commons-lang,commons-logging

1.3.5.org.springframework.ldap.core.simple
该包提供了部分Spring LDAP的Java5特性,主要是使用java的泛型简化开发,得到更好的context容器,更好的查询和操作方法。
?依赖关系:ldap.core

1.3.6.org.springframework.ldap.pool
该包提供了在per-ContextSource基础上的连接池配置支持。池操作支持通过PoolingContextSource包装ContextSource和池只读和读写DirContext对象。JakartaCommons-Pool提供最基本的池实现
?依赖关系:ldap.core,commons-lang,commons-pool

1.3.7.org.springframework.ldap.pool.factory
该包提供了实际池连接函数和其它创建连接函数
?依赖关系:ldap,ldap.core,ldap.pool,spring-beans,spring-txcommons-lang,commons-logging,commons-pool

1.3.8.org.springframework.ldap.pool.validation
该包提供了对池连接的验证支持
?依赖关系:ldap.pool,commons-lang,commons-logging

1.3.9.org.springframework.ldap.support
该包提供一些辅助工具函数,如异常转换等
?依赖关系:ldap,spring-core,commons-logging

1.3.10.org.springframework.ldap.authentication
该包包含了一个AuthenticationSource接口的实现,即使在没有登录的情况下,也可以用它来查询一些信息
?依赖关系:ldap.core,spring-beans,commons-lang

1.3.11.org.springframework.ldap.control
该包包含了一个DirContextProcessor的抽象接口,用来做请求控制。还有一个具体搜索分页及排序。除非使用JAVA5,LDAP Booster Pack才可以用来获得请求和控制
?依赖关系:ldap,ldap.core,LDAPboosterpack(optional),spring-core,commons-lang,
commons-logging

1.3.12.org.springframework.ldap.filter
该包提供过滤器库及一些实现
?依赖关系:ldap.core,spring-core,commons-lang

1.3.13.org.springframework.ldap.transaction.compensating
该包提供了一些LDAP-specific的核心事务实现
?依赖关系:ldap.core,transaction.compensating,spring-core,commons-lang,commons-logging

1.3.14.org.springframework.ldap.transaction.compensating.manager
该包提供了一些客户端的核心事务实现
?依赖关系:ldap,ldap.core,ldap.support,ldap.transaction.compensating,transaction.compensating,
spring-tx,spring-jdbc,spring-orm,commons-logging

1.3.15.org.springframework.ldap.transaction.compensating.support
该包提供了一些有用客户端的核心事务实现的其它函数
?依赖关系:ldap.core,ldap.transaction.compensating

具体的JAR包请从源代码包中获得

Spring Ldap支持Spring 2.0及以上版本
社区支持论坛:http://forum.springframework.org
项目主页:http://www.springframework.org/ldap

© 著作权归作者所有

追梦java
粉丝 3
博文 157
码字总数 157529
作品 0
南京
程序员
私信 提问
不修改密码,怎么修改用户DN?

公司的LDAP服务器是使用OpenDJ,需要和公司内部的系统进行账号同步 LDAP的密码也是使用MD5 因为内部系统是我们自己开发的,所以可以修改其代码 现在遇到一个问题 内部系统后台数据库只存储了密...

光石头
2011/05/18
980
3
【总结】基于Spring LDAP和Spring Security的用户认证和权限控制Web实现

利用LDAP服务,使用Spring LDAP,Spring Security实现Web项目用户认证和简单的权限控制。实现多系统账号统一。 1、基于EHR的LDAP用户信息 LDAP是轻量目录访问协议,英文全称是Lightweight Dir...

巧克力黒
2018/06/27
0
0
springldap重命名策略配置

我的项目是spring mvc+hibernate+ldap,其中用到了springldap,版本是2.0.1。我想要对ldap中所有条目的都能进行dn修改或者重命名,但是当对有子节点的条目进行这些操作是,报出如下错误: Ex...

lilidai
2014/06/12
1K
0
springldap 数组属性的写入读取

使用openLDAP作为存储目录,用spring ldap开发。如果某个属性为数组,怎样才能将它的几个属性一一写进去或者取出来?查了很多资料,都没有说到这个问题的。spring ldap是不是不支持数组属性?...

lilidai
2015/03/04
461
1
springLdap 操作 ad域例子(应该比较详细)

1、验证管理员账户 比如域如下: 则用户名就得写成: Administrator@sendo.com (Administrator是window server的管理员账户)

sendo
2018/03/01
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

正则表达式匹配

请实现一个函数用来匹配包括 '.' 和 '*' 的正则表达式。模式中的字符 '.' 表示任意一个字符,而 '*' 表示它前面的字符可以出现任意次(包含 0 次)。 在本题中,匹配是指字符串的所有字符匹配...

Garphy
38分钟前
5
0
Laravel 5.1的多路由文件的配置

默认的路由配置文件只有一个, \app\Http\routes.php。 在同一个文件中写路由容易起冲突,文件会越来越大,就需要定义多个路由文件。 找到加载\app\Http\routes.php的文件, 打开\app\Provid...

mdoo
今天
5
0
Hibernate 5 开始使用指南前言

同时在面向对象软件和关系型数据库进行工作,可能会非常复杂和费时。数据在对象和数据库之间可能会不一致,然后导致开发成本会非常高。 Hibernate 是一个针对 Java 环境的对象关系映射(Obj...

honeymoose
今天
5
0
聊聊nacos ServiceManager的UpdatedServiceProcessor

序 本文主要研究一下nacos ServiceManager的UpdatedServiceProcessor ServiceManager.init nacos-1.1.3/naming/src/main/java/com/alibaba/nacos/naming/core/ServiceManager.java @Compone......

go4it
今天
7
0
正则表达式的使用(QQ格式的判断与空格的切割)

//正则表达式的使用 public static void main(String[] args) throws IOException, ClassNotFoundException { //test1("123456"); test2("-1 99 kk"); } /** * ......

zhengzhixiang
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部