|
对于最新稳定版本,请使用 Spring LDAP 4.0.0! |
配置
推荐的配置 Spring LDAP 方式是使用自定义的 XML 配置命名空间。为了提供此功能,您需要在 bean 文件中包含 Spring LDAP 命名空间声明,具体如下:
<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:context-source
username="cn=Administrator"
password="secret"
url="ldap://localhost:389" />
上述例子构成了LdapContextSource使用默认值(见本段后表)以及指定的URL和认证凭证。
上下文源代码上的可配置属性如下(必填属性标注为*):
| 属性 | 默认值 | 描述 |
|---|---|---|
|
|
被创造豆子的ID。 |
|
在与LDAP服务器认证时使用的用户名(主体)。
这通常是管理员用户的显著名称(例如, |
|
|
与LDAP服务器认证时使用的密码(凭据)。如果 |
|
|
使用的LDAP服务器的网址。该网址应为以下格式: |
|
|
|
基础DN。当该属性被配置后,所有从LDAP作中提供和接收的特殊名称都是相对于指定的LDAP路径。 这大大简化了对LDAP树的管理。不过,有几次你需要进入基地路径。 关于此的更多信息,请参见获取基础LDAP路径的引用 |
|
|
定义了只读作是否通过使用匿名(未认证)上下文执行。
注意将该参数设置为 |
|
|
定义了处理转介的策略,如此处所述。有效数值如下:
|
|
|
指定是否应使用原生Java LDAP连接池。可以考虑使用 Spring LDAP 连接池。更多信息请参见“支持池”。 |
|
一个 |
该身份 |
|
一个 |
该身份 |
|
对 |
DirContext认证
什么时候DirContext实例是为在 LDAP 服务器上执行作而创建的,这些上下文通常需要认证。
Spring LDAP提供了多种配置选项。
本节涉及在核心功能中验证上下文上下文来源,构造DirContext用于LdapClient和LdapTemplate.LDAP通常仅用于用户认证,且上下文来源也可以用来做这个。该过程在使用 Spring LDAP 的用户认证中有所讨论。 |
默认情况下,认证上下文会为只读和写作创建。你应该具体说明用户名和密码用于认证的LDAP用户上下文-来源元素。
如果用户名是LDAP用户的区分名称(DN),必须是LDAP树根节点的完整DN,无论是否为基础LDAP路径已在上下文-来源元素。 |
一些LDAP服务器设置允许匿名只读访问。如果你想用匿名上下文进行只读作,可以设置匿名只读归属为true.
习惯DirContext认证处理
Spring LDAP 使用的默认认证机制是简单认证。这意味着主体(由用户名属性)以及凭证(由密码)被设定在哈希表该 被发送到DirContext实现构造器。
很多情况下,这种处理并不充分。例如,LDAP服务器通常设置为仅接受安全TLS信道上的通信。可能需要使用特定的LDAP代理认证机制或其他顾虑。
您可以通过提供DirContext认证策略实现参考上下文-来源元素。为此,设置认证策略参考属性。
TLS
Spring LDAP 为需要 TLS 安全通道通信的 LDAP 服务器提供了两种不同的配置选项:DefaultTlsDirContextAuthenticationStrategy和外部TlsDirContextAuthenticationStrategy(外部TlsDirContextAuthenticationStrategy). 两种实现在目标连接上协商一个TLS信道,但在实际认证机制上有所不同。 哪里DefaultTlsDirContextAuthenticationStrategy在安全信道上应用SIMPLE认证(通过使用指定的用户名和密码),外部TlsDirContextAuthenticationStrategy(外部TlsDirContextAuthenticationStrategy)使用外部 SASL 认证,应用通过系统属性进行认证配置的客户端证书。
由于不同的LDAP服务器实现对显式关闭TLS信道的响应不同(有些服务器要求优雅地关闭连接,而另一些则不支持),TLS的DirContext认证策略实现支持通过使用关闭了优雅地关闭参数。 如果该性质被设置为false(默认情况下),不会显式地关闭TLS。如果发生了trueSpring LDAP 会在关闭目标上下文前优雅地关闭 TLS 通道。
在处理TLS连接时,你需要确保原生的LDAP池化功能(如使用以下条件所指定的原生池属性)被关闭。这在关闭了优雅地关闭设置为false. 然而,由于TLS信道协商过程成本较高,使用Spring LDAP池化支持(详见池化支持)可以获得极大的性能提升。 |
自定义主体与凭证管理
而用于创建的用户名(即用户DN)和密码则经过认证上下文默认是静态定义的(定义在上下文-来源元素配置贯穿整个生命周期上下文来源),但有几种情况下这并非理想的行为。一个常见场景是,执行该用户的LDAP作时应使用当前用户的主体和凭证。你可以通过提供引用来修改默认行为,认证源实现到......上下文-来源通过使用认证-来源-参考元素,而不是明确指定用户名和密码. 这认证源被查询的对象是上下文来源每次认证时,主体和凭证上下文是被创造的。
如果你使用 Spring Security,可以通过配置你的上下文来源其中有一个实例SpringSecurityAuthenticationSource随Spring Security一起发售。以下示例展示了如何实现:
<beans>
...
<ldap:context-source
url="ldap://localhost:389"
authentication-source-ref="springSecurityAuthenticationSource"/>
<bean id="springSecurityAuthenticationSource"
class="org.springframework.security.ldap.authentication.SpringSecurityAuthenticationSource" />
...
</beans>
我们没有指定任何用户名或密码为。 我们上下文-来源当使用认证源. 这些属性仅在默认行为使用时才需要。 |
当使用SpringSecurityAuthenticationSource你需要用Spring Security的LdapAuthenticationProvider用于验证用户对LDAP的认证。 |
原生Java LDAP池
内部的Java LDAP提供商提供了一些非常基础的池化功能。您可以通过使用汇集旗帜开启摘要上下文来源. 默认值为false(自1.3版本起)——即本地Java LDAP池被关闭。LDAP连接池的配置通过以下方式管理系统属性,所以你需要手动处理,而不是在 Spring Context 配置之外。你可以在这里找到本地池化配置的详细信息。
| 内置的 LDAP 连接池存在若干严重缺陷,这也是 Spring LDAP 提供了更复杂的 LDAP 连接池方法的原因,详见池化支持。如果你需要池化功能,这是推荐的方法。 |
无论池化配置如何,ContextSource#getContext(String principal, String credentials)方法始终明确不使用原生Java LDAP池,以便重置密码尽快生效。 |
LdapClient配置
LdapClient是调用LDAP后端的新接口。它在基础上有所改进LdapTemplate具体方式如下:
-
提供内置功能
流支持 -
提供一个简化的API,围绕绑定©、搜索®、修改(U)、解绑(D)和认证。
LdapClient目前尚未支持 ODM。
如果你需要这个,LdapTemplate拥有此能力。
双LdapClient和LdapTemplate如果需要,可以很好地共存于同一应用中。 |
一LdapClient定义为使用LdapClient#create工厂方法如下:
<bean id="ldapClient" class="org.springframework.ldap.core.LdapClient" factory-method="create">
<constructor-arg ref="contextSource" />
</bean>
该元素引用默认值上下文来源,期望的ID为背景来源(默认情况下上下文-来源元素)。
你LdapClient实例可以配置如何处理某些已检查的异常以及默认情况搜索控制应用于查询。
LdapTemplate配置
这LdapTemplate通过使用<ldap:ldap-template>元素。最简单的LDAP-模板声明本身就是该元素:
<ldap:ldap-template />
该元素本身会产生LdapTemplate实例中带有默认ID,引用默认ID。上下文来源,期望的ID为背景来源(默认情况下上下文-来源元素)。
下表描述了 的可配置属性LDAP-模板:
| 属性 | 默认值 | 描述 |
|---|---|---|
|
|
被创造豆子的ID。 |
|
|
该身份证 |
|
|
搜索的默认计数限制。0 表示没有限制。 |
|
|
搜索的默认时间限制是毫秒级。0 表示没有限制。 |
|
|
搜索的默认范围。有效数值如下:
|
|
|
指定 |
|
|
指定 |
|
该身份证 |
获取对基础LDAP路径的引用
如前所述,你可以提供一个基础的LDAP路径到上下文来源,指定LDAP树中所有作相对的根节点。这意味着你只需在系统中处理相对知名的名字,这通常非常方便。不过,在某些情况下,你可能需要访问基础路径,才能构造完整的DN,相对于LDAP树的实际根节点。一个例子是处理LDAP组时(例如,名字组对象类)。在这种情况下,每个组成员的属性值必须是被引用成员的完整DN。
因此,Spring LDAP 有一个机制,可以在启动时为任何 Spring 控制的豆子提供基础路径。
要让豆子收到基础路径的通知,需要具备两点条件。首先,想要基础路径引用的豆子需要实现BaseLdapNameAware接口。
其次,你需要定义一个BaseLdapPathBeanPostProcessor在应用的语境下。
以下示例展示了如何实现BaseLdapNameAware:
BaseLdapNameAwarepublic class PersonService implements PersonService, BaseLdapNameAware {
...
private LdapName basePath;
public void setBaseLdapPath(LdapName basePath) {
this.basePath = basePath;
}
...
private LdapName getFullPersonDn(Person person) {
return LdapNameBuilder.newInstance(basePath)
.add(person.getDn())
.build();
}
...
}
以下示例展示了如何定义BaseLdapPathBeanPostProcessor:
<beans>
...
<ldap:context-source
username="cn=Administrator"
password="secret"
url="ldap://localhost:389"
base="dc=261consulting,dc=com" />
...
<bean class="org.springframework.ldap.core.support.BaseLdapPathBeanPostProcessor" />
</beans>
默认行为BaseLdapPathBeanPostProcessor是使用单一定义的基路径BaseLdapPathSource (摘要上下文来源)应用上下文.如果不止一个BaseLdapPathSource定义后,你需要通过设置baseLdapPathSourceName财产。