第二章 基本操作
在这个例子中,我们将使用AttributesMapper轻松的将person类型的对象属性返回。
例2.1 AttributesMapper 返回一个单一属性
packagecom.example.dao;
publicclassPersonDaoImplimplementsPersonDao{
privateLdapTemplateldapTemplate;
publicvoidsetLdapTemplate(LdapTemplateldapTemplate){
this.ldapTemplate=ldapTemplate;
}
publicListgetAllPersonNames(){
returnldapTemplate.search(
"","(objectclass=person)",
newAttributesMapper(){
publicObjectmapFromAttributes(Attributesattrs)
throwsNamingException{
returnattrs.get("cn").get();
}
});
}
}
AttributesMapper的具体实现是从Attributes中得到想要的属性并返回,在内部,LdapTemplate遍历所有条目,给予AttributesMapper每个项(entry),并汇集结果放在一个集合中,然后向查询方法返回集合。
例2.2 AttributesMapper 返回一个person对象
packagecom.example.dao;
publicclassPersonDaoImplimplementsPersonDao{
privateLdapTemplateldapTemplate;
...
privateclassPersonAttributesMapperimplementsAttributesMapper{
publicObjectmapFromAttributes(Attributesattrs)throwsNamingException{
Personperson=newPerson();
person.setFullName((String)attrs.get("cn").get());
person.setLastName((String)attrs.get("sn").get());
person.setDescription((String)attrs.get("description").get());
returnperson;
}
}
publicListgetAllPersons(){
returnldapTemplate.search("","(objectclass=person)", newPersonAttributesMapper());
}
}
如果你有一个DN直接标识一个条目,你可以直接找到它,而不需要去检索。这就是所谓的java ldap查找方式。下面示例展示了如何查找结果封装在一个person对象中
例2.3 查找结果封装在一个person对象中
packagecom.example.dao;
publicclassPersonDaoImplimplementsPersonDao{
privateLdapTemplateldapTemplate;
...
publicPersonfindPerson(Stringdn){
return(Person)ldapTemplate.lookup(dn,newPersonAttributesMapper());
}
}
我们将根据指定的dn查找到我们想要的属性放在AttributesMapper中,在这种情况下,封装在person对象中
2.2构建动态过滤器
我们可以构建一个动态过滤器用于搜索中,使用的是org.springframework.ldap.filter包。比方说,我们希望下面的过滤器(&(objectclass=person)(sn=?)),其中的?替换成我们的参数值lastname,下面的代码告诉你我们是如何做到的:
例2.4 构建动态过滤器
packagecom.example.dao;
publicclassPersonDaoImplimplementsPersonDao{
privateLdapTemplateldapTemplate;
...
publicListgetPersonNamesByLastName(StringlastName){
AndFilterfilter=newAndFilter();
filter.and(newEqualsFilter("objectclass","person"));
filter.and(newEqualsFilter("sn",lastName));
returnldapTemplate.search(
"", filter.encode(),
newAttributesMapper(){
publicObjectmapFromAttributes(Attributesattrs)
throwsNamingException{
returnattrs.get("cn").get();
}
});
}
}
要使用通配符查询,可以用WhitespaceWildcardsFilter
例2.5 构建通配符查询过滤器
AndFilterfilter=newAndFilter();
filter.and(newEqualsFilter("objectclass","person"));
filter.and(newWhitespaceWildcardsFilter("cn",cn));
注意:
除了简化过滤器,过滤器本身也应该适当屏蔽一些不安全字符,这样是为了避免ldap注入,有些人可能利用这些字符注入ldap进行一些非法操作。
2.3建立一个动态可识别的名称
标准名称接口只是一个通用名称,它只是一个序列的基本组成部分,该名称接口还提供了关于序列的操作。例如 add和remove.LdapTemplate提供了一个name的接口实现,DistinguishedName,使用它可以轻松的建立一个可识别的名称。 特别是考虑到复杂性和编码问题,这将有助于防止恶意代码注入到你的ldap中进行操作
下面的例子说明了如何利用DistinguishedName来构建一个动态可识别名称
例 2.6 建立一个动态可识别的名称
packagecom.example.dao;
importorg.springframework.ldap.core.support.DistinguishedName;
importjavax.naming.Name;
publicclassPersonDaoImplimplementsPersonDao{
publicstaticfinalStringBASE_DN="dc=example,dc=com";
...
protectedNamebuildDn(Personp){
DistinguishedNamedn=newDistinguishedName(BASE_DN);
dn.add("c",p.getCountry());
dn.add("ou",p.getCompany());
dn.add("cn",p.getFullname());
returndn;
}
}
设想一个人有如下属性:
country Sweden
company SomeCompany
fullname SomePerson
以上的代码将会返回如下的可识别名称
cn=SomePerson,ou=SomeCompany,c=Sweden,dc=example,dc=com
在Java5中有一个名称接口的实现Ldap Name,如果你使用Java5,你可以很好的使用LdapName,当然你也可以继续使用DistinguishedName
2.4绑定与反绑定
在JavaLdap中插入数据称为绑定,为了做到这一点,有一个准确可识别的名称,唯一的标识是插入条目所必须的,下面的代码展示了如何用LdapTemplate绑定一条数据
例2.7 向条目上绑定属性
packagecom.example.dao;
publicclassPersonDaoImplimplementsPersonDao{
privateLdapTemplateldapTemplate;
...
publicvoidcreate(Personp){
Namedn=buildDn(p);
ldapTemplate.bind(dn,null,buildAttributes(p));
}
privateAttributesbuildAttributes(Personp){
Attributesattrs=newBasicAttributes();
BasicAttributeocattr=newBasicAttribute("objectclass");
ocattr.add("top");
ocattr.add("person");
attrs.put(ocattr);
attrs.put("cn","SomePerson");
attrs.put("sn","Person");
returnattrs;
}
}
属性的绑定的代码虽然比较枯燥和冗长,但是我们也有更简便的操作方式,这将是我们在第3章中所介绍的,用DirContextAdapter访问属性和操作
2.4.2 反绑定数据
删除数据在JavaLdap中我们称为反绑定,一个唯一的标识(DN)是识别条目所必须的,正如数据绑定一样。下面的示例演示了如何用LdapTemplate来反绑定数据
例2.8 反绑定数据
packagecom.example.dao;
publicclassPersonDaoImplimplementsPersonDao{
privateLdapTemplateldapTemplate;
...
publicvoiddelete(Personp){
Namedn=buildDn(p);
ldapTemplate.unbind(dn);
}
}
2.5 修改
在JavaLdap中修改数据有两种方法,用rebind和modifyAttrbutes
2.5.1 用rebind修改
用rebind去修改数据非常粗糙,它基本上就是拆散后再绑定,它看起来像这样
例2.9 用rebind修改
packagecom.example.dao;
publicclassPersonDaoImplimplementsPersonDao{
privateLdapTemplateldapTemplate;
...
publicvoidupdate(Personp){
Namedn=buildDn(p);
ldapTemplate.rebind(dn,null,buildAttributes(p));
}
}
2.5.2 用ModifyAttrbutes修改
如果只是修改属性,那么应该用ModifyAttrbutes,它用一个数组作为参数。
例2.10 用ModifyAttrbutes修改
packagecom.example.dao;
publicclassPersonDaoImplimplementsPersonDao{
privateLdapTemplateldapTemplate;
...
publicvoidupdateDescription(Personp){
Namedn=buildDn(p);
Attributeattr=newBasicAttribute("description",p.getDescription())
ModificationItemitem=newModificationItem(DirContext.REPLACE_ATTRIBUTE,attr);
ldapTemplate.modifyAttributes(dn,newModificationItem[]{item});
}
}
构建属性和修改条目是一项工作量很大的工作,但是当你看到第三章 ,使用DirContextAdapter简便访问属性和操作,这一切将变得很简单
2.6 示例应用
最好的做法是查看Sping Ldap的示例包。包说明如下:
1.spring-ldap-person-该示例展示了大部分功能
2.spring-ldap-article-该示例展示了关于SpringLdap如何写入到java.net的article
分享到:
相关推荐
### Spring LDAP 参考文档详解 #### 前言 Spring LDAP 是一款为简化 LDAP (Lightweight Directory Access Protocol) 操作而设计的框架。它基于 Spring 框架,利用了 Spring 的强大功能来实现对 LDAP 目录的访问、...
由于提供的文件内容是关于Spring Security的参考资料,接下来将详细说明Spring Security 4.0.4.RELEASE版本中涉及的关键知识点。在展开知识点介绍之前,需要指出,由于原文件可能包含一些格式错误或 OCR 识别的问题...
根据给定的文件信息,以下是对“Spring-LDAP”参考文档的知识点总结与扩展: ### Spring-LDAP概述 Spring-LDAP是Spring框架的一部分,专注于提供与轻量级目录访问协议(LDAP)集成的功能。它简化了开发人员在Java...
2. `spring-ldap-reference.pdf`:这个文件很可能是 Spring LDAP 的官方参考文档,包含了框架的所有类、接口和方法的详细介绍,以及示例代码。通过阅读此文档,你可以深入理解 Spring LDAP 的工作原理,学习如何配置...
#### 二、Spring Security 4.0 新特性 ##### 2.1 新特性 Spring Security 4.0 引入了多个新特性,例如: - **Java 配置支持**:通过 Java 代码而不是 XML 来配置安全规则,使得代码更简洁且易于维护。 - **增强的...
#### 二、Spring Security 4.1 新特性 ##### 2.1 Java 配置改进 Spring Security 4.1 在 Java 配置方面做了大量改进,使得配置更加灵活和简洁。 ##### 2.2 Web 应用安全改进 增强了 Web 应用的安全性,例如改进...
### Spring Security 参考文档概览 #### 一、引言与基础知识 ##### 1.1 什么是 Spring Security? Spring Security 是一个强大的、高度可定制的身份验证和访问控制框架。它为应用程序提供了一种机制来保护自身免...
### Spring Security Reference中文版知识点概览 #### 一、Spring Security 概述 - **Spring Security** 是一个强大的和高度可定制的身份验证和访问控制框架。它为基于Spring的应用提供了声明式的安全服务。 ####...
标题:springsecurity3.1.pdf 描述:springsecurity3.1.pdf 标签:spring security3.1 部分内容:SpringSecurity Reference Documentation by Ben Alex and Luke Taylor 3.1.4.RELEASE **一、Spring Security 3.1...
首先,"Apache_Shiro_reference(中文版).pdf"是Shiro的官方中文参考手册。这个文档详细介绍了Shiro的各种组件和API,包括核心概念如Subject、Realms、Caches等,以及认证、授权、会话管理和密码策略等具体功能。通过...
`Reference_Guide_en-US.pdf`是关于JBoss Portal全面技术细节的参考文档,包括API详解、配置选项、系统架构等深入内容,适合开发者和高级用户查阅。 **8. 用户指南** `User_Guide_en-US.pdf`可能专注于用户界面和...