Spring安全ldap连接管理

时间:2014-11-19 23:36:45

标签: spring-security spring-ldap

我正在使用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安全管理其连接的方式?

我也有兴趣知道在认证过程中使用自定义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 个答案:

答案 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添加到您的项目中。