介绍
本节将简要介绍 Spring LDAP。内容包括:
概述
Spring LDAP 旨在简化 Java 中的 LDAP 编程。该库提供的一些功能包括:
-
JdbcTemplate
风格的模板简化 LDAP 编程。 -
JPA 或 Hibernate 风格的基于注解的对象和目录映射。
-
Spring Data 存储库支持,包括对 QueryDSL 的支持。
-
简化构建 LDAP 查询和区分名称的实用程序。
-
正确的 LDAP 连接池。
-
客户端 LDAP 补偿事务支持。
传统 Java LDAP 与 LdapClient
考虑一个应该搜索某些存储以查找所有人员并将其姓名返回到列表中的方法。使用 JDBC,我们将创建一个连接并使用语句运行查询。然后,我们将遍历结果集并检索我们想要的列,将其添加到列表中。
使用 JNDI 针对 LDAP 数据库,我们将创建一个上下文并使用搜索过滤器执行搜索。然后,我们将遍历结果命名枚举,检索我们想要的属性,并将其添加到列表中。
在 Java LDAP 中实现此人员姓名搜索方法的传统方法类似于下一个示例。请注意标记为粗体的代码 - 这是实际执行与方法业务目的相关的任务的代码。其余部分是管道。
public class TraditionalPersonRepoImpl implements PersonRepo {
public List<String> getAllPersonNames() {
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://127.0.0.1:389/dc=example,dc=com");
DirContext ctx;
try {
ctx = new InitialDirContext(env);
} catch (NamingException e) {
throw new RuntimeException(e);
}
List<String> list = new LinkedList<String>();
NamingEnumeration results = null;
try {
SearchControls controls = new SearchControls();
controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
results = ctx.search("", "(objectclass=person)", controls);
while (results.hasMore()) {
SearchResult searchResult = (SearchResult) results.next();
Attributes attributes = searchResult.getAttributes();
Attribute attr = attributes.get("cn");
String cn = attr.get().toString();
list.add(cn);
}
} catch (NameNotFoundException e) {
// The base context was not found.
// Just clean up and exit.
} catch (NamingException e) {
throw new RuntimeException(e);
} finally {
if (results != null) {
try {
results.close();
} catch (Exception e) {
// Never mind this.
}
}
if (ctx != null) {
try {
ctx.close();
} catch (Exception e) {
// Never mind this.
}
}
}
return list;
}
}
使用 Spring LDAP AttributesMapper
和 LdapClient
类,我们可以使用以下代码获得完全相同的功能
import static org.springframework.ldap.query.LdapQueryBuilder.query;
public class PersonRepoImpl implements PersonRepo {
private LdapClient ldapClient;
public void setLdapClient(LdapClient ldapClient) {
this.ldapClient = ldapClient;
}
public List<String> getAllPersonNames() {
return ldapClient.search().query(
query().where("objectclass").is("person")
).toObject((Attributes attrs) ->
attrs.get("cn").get().toString();
);
}
}
样板代码的数量明显少于传统示例。LdapClient
搜索方法确保创建 DirContext
实例,执行搜索,使用给定的 AttributesMapper
将属性映射到字符串,将字符串收集到内部列表中,最后返回列表。它还确保正确关闭 NamingEnumeration
和 DirContext
,并处理可能发生的任何异常。
当然,作为 Spring Framework 的子项目,我们使用 Spring 来配置我们的应用程序,如下所示
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ldap="http://www.springframework.org/schema/ldap"
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/ldap https://www.springframework.org/schema/ldap/spring-ldap.xsd">
<ldap:context-source
url="ldap://127.0.0.1:389"
base="dc=example,dc=com"
username="cn=Manager"
password="secret" />
<bean id="ldapClient" class="org.springframework.ldap.core.LdapClient" factory-method="create">
<constructor-arg ref="contextSource" />
</bean>
<bean id="personRepo" class="com.example.repo.PersonRepoImpl">
<property name="ldapClient" ref="ldapClient" />
</bean>
</beans>
要使用自定义 XML 命名空间来配置 Spring LDAP 组件,您需要在 XML 声明中包含对该命名空间的引用,如前面的示例所示。 |
2.1 中的新功能
-
#390: 添加了 Spring Data Hopper 支持
-
#351: 添加了对 commons-pool2 的支持
-
#370: 添加了对 XML 命名空间中属性占位符的支持
-
#392: 添加了文档测试支持
-
#401: 添加了一个切换到 assertj 的选项
-
从 JIRA 迁移到 GitHub Issues
-
添加了 Gitter Chat
2.0 中的新功能
虽然 Spring LDAP API 在 2.0 版本中进行了相当重大的现代化改造,但我们非常注意尽可能确保向后兼容性。在大多数情况下,使用 Spring LDAP 1.3.x 的代码在使用 2.0 库时无需任何修改即可编译和运行。
例外情况是少数几个类被移动到新的包中,以便进行一些重要的重构。这些移动的类通常不属于预期的公共 API,迁移过程应该很顺利。如果在升级后找不到 Spring LDAP 类,您应该整理 IDE 中的导入。
不过,您可能会遇到一些弃用警告,并且还有一些其他 API 改进。为了充分利用 2.0 版本,建议您从弃用的类和方法迁移到新的、改进的 API 工具。
以下列表简要描述了 Spring LDAP 2.0 中最重要的更改
-
Spring LDAP 现在需要 Java 6。从 2.0 及更高版本的 Spring 版本仍然受支持。
-
核心 API 已使用 Java 5+ 功能(如泛型和可变参数)进行了更新。因此,整个
spring-ldap-tiger
模块已弃用,我们建议您迁移到使用核心 Spring LDAP 类。核心接口的参数化会导致现有代码出现大量编译警告,我们建议您采取适当措施消除这些警告。 -
ODM(对象目录映射)功能已移至核心,
LdapOperations
和LdapTemplate
中有新的方法使用此自动转换来往 ODM 注释类。有关更多信息,请参阅 对象目录映射 (ODM)。 -
现在(最终)提供了一个自定义 XML 命名空间来简化 Spring LDAP 的配置。有关更多信息,请参阅 [配置]。
-
Spring LDAP 现在提供对 Spring Data Repository 和 QueryDSL 的支持。有关更多信息,请参阅 Spring LDAP 存储库。
-
Name
实例作为属性值现在在DirContextAdapter
和 ODM 中关于区分名称相等性得到正确处理。有关更多信息,请参阅DirContextAdapter
和区分名称作为属性值 和 ODM 和区分名称作为属性值。 -
DistinguishedName
和相关类已弃用,取而代之的是标准 JavaLdapName
。有关库在使用LdapName
对象时如何提供帮助的信息,请参阅 动态构建区分名称。 -
已添加流畅的 LDAP 查询构建支持。这使得在 Spring LDAP 中使用 LDAP 搜索时编程体验更加愉快。有关 LDAP 查询构建器支持的更多信息,请参阅 构建 LDAP 查询 和 高级 LDAP 查询。
-
LdapTemplate
中的旧authenticate
方法已弃用,取而代之的是几个新的authenticate
方法,这些方法使用LdapQuery
对象并在身份验证失败时抛出异常,使用户更容易找出导致身份验证尝试失败的原因。 -
已对 示例 进行整理和更新,以利用 2.0 中的功能。已经投入了相当多的精力来提供一个有用的 LDAP 用户管理应用程序 示例。
打包概述
至少,要使用 Spring LDAP,您需要以下内容
-
spring-ldap-core
:Spring LDAP 库 -
spring-core
:框架内部使用的各种实用程序类 -
spring-beans
:用于操作 Java Bean 的接口和类 -
slf4j
:一个简单的日志记录外观,在内部使用
除了必需的依赖项之外,以下可选依赖项对于某些功能是必需的
-
spring-data-ldap
:存储库支持等的基础设施 -
spring-context
:如果您的应用程序通过使用 Spring 应用程序上下文进行连接,则需要。spring-context
为应用程序对象添加了使用一致 API 获取资源的能力。如果您计划使用BaseLdapPathBeanPostProcessor
,则绝对需要它。 -
spring-tx
:如果您计划使用客户端侧补偿事务支持,则需要它。 -
spring-jdbc
:如果您计划使用客户端侧补偿事务支持,则需要它。 -
commons-pool
:如果您计划使用池功能,则需要它。 -
spring-batch
:如果您计划将 LDIF 解析功能与 Spring Batch 一起使用,则需要它。
spring-data-ldap 传递性地添加了spring-repository.xsd ,spring-ldap.xsd 使用它。因此,即使没有使用 Spring Data 的功能集,Spring LDAP 的 XML 配置支持也需要该依赖项。
|
入门
该示例提供了一些关于如何将 Spring LDAP 用于常见用例的有用示例。
支持
如果您有任何问题,请在Stack Overflow 上使用spring-ldap
标签提问。项目网页是spring.io/spring-ldap/.
致谢
感谢Structure101提供了一个开源许可证,该许可证在保持项目结构井然有序方面非常有用。