Spring 安全 ldap 连接管理

Posted

技术标签:

【中文标题】Spring 安全 ldap 连接管理【英文标题】:Spring security ldap connection management 【发布时间】:2015-01-17 16:43:21 【问题描述】:

我正在使用 spring security 对登录到 webapp 的用户进行身份验证。当前使用 ldap 完成身份验证。

在我的 webapp 和我的 ldap 服务器之间有一个防火墙。在 50 分钟不活动后,防火墙会刷新空闲的 ldap 连接。

Spring 安全性有时会重用现有连接,但并非总是如此。如果它选择了一个被我的防火墙关闭的连接,登录将失败。

我在 Tomcat 日志中发现的异常如下。

org.springframework.ldap.ServiceUnavailableException: ldap:389; socket closed; nested exception is javax.naming.ServiceUnavailableException

更具体地说,导致问题的连接是用于搜索请求的连接。它们没有被框架系统地关闭。绑定请求总是在请求结束时关闭的新连接上发出。

在我的应用程序中,由于自定义 LdapAuthoritiesPopulator 仅授予具有特定角色的用户访问权限,因此在绑定后发出搜索请求。我已经验证了默认的 LdapAuthoritiesPopulator 以相同的方式发出搜索请求。

搜索请求连接几乎无限期保持打开状态是否正常? 如果是,有没有办法可以改变 spring security 管理其连接的方式?

我也很想知道是否有比使用自定义 LdapAuthoritiesPopulator 在身份验证期间强制执行角色约束更好的方法。

尝试简单升级后我的问题仍然存在:

spring-security 3.1.7(从 3.1.2 上调) spring-ldap-core 2.0.2(从 1.3.0 上调) spring-ldap 1.3.1(从 1.3.0 上调)

谢谢。

【问题讨论】:

你现在使用哪个版本? 【参考方案1】:

解决方案是使用 ldap-spring 池化和验证。 http://docs.spring.io/spring-ldap/docs/1.3.x/reference/html/pooling.html

第一步是定义<beans:property name="pooled" value="false"/>。这样,所有请求(绑定或搜索)都在独立连接上进行。

如果您有很多 ldap 连接需要处理并希望最小化连接开销,那么您必须设置其他对象来定义连接池行为。这一切都在文档中得到了很好的解释。

从 spring-ldap 1.3 开始,您需要将 commons-pool 1.6 添加到您的项目中。

【讨论】:

以上是关于Spring 安全 ldap 连接管理的主要内容,如果未能解决你的问题,请参考以下文章

Spring 安全性和 ldap

如何在没有 DAO 的情况下使用 Spring LDAP 连接到多个 url?

Spring 安全性、ssl ldap 和无证书

Spring-Ldap连接Ldap及简单的增删查改

spring的事务管理实现

管理 ldap 中的特殊角色