Spring Security身份验证详细介绍( 十 )


配置
ActiveDirectoryLdapAuthenticationProvider非常简单 。您只需要提供域名和提供服务器地址的LDAP URL 。下面是一个配置示例:
@BeanActiveDirectoryLdapAuthenticationProvider authenticationProvider() {return new ActiveDirectoryLdapAuthenticationProvider("example.com", "ldap://company.example.com/");}会话管理HTTP会话相关的功能是通过SessionManagementFilter和
SessionAuthenticationStrategy接口的组合来处理的,该接口由过滤器委托给它 。典型的应用包括会话固定保护、攻击预防、会话超时检测和限制通过身份验证的用户可以同时打开的会话数量 。

  • 检测超时
您可以配置Spring Security来检测无效会话ID的提交,并将用户重定向到适当的URL 。这是通过会话管理元素实现的:
protected void configure(HttpSecurity http) {http.sessionManagement().invalidSessionUrl("/invalidSession.htm");}注意,如果您使用这种机制来检测会话超时,如果用户登出,然后在没有关闭浏览器的情况下重新登录,它可能会错误地报告错误 。这是因为当您使会话失效时,会话cookie不会被清除,即使用户已经注销,它也会被重新提交 。你可以在登出时显式地删除JSESSIONID cookie,例如在登出处理程序中使用以下语法:
protected void configure(HttpSecurity http) {http.logout().deleteCookies("JSESSIONID");}不幸的是,这不能保证对每个servlet容器都适用,所以您需要在您的环境中测试它 。
如果您在代理服务器后运行应用程序,您还可以通过配置代理服务器来删除会话cookie 。例如,使用Apache HTTPD的mod_headers,下面的指令会在登出请求的响应中使JSESSIONID过期,从而删除JSESSIONID cookie(假设应用程序部署在路径为 /tutorial下):
<LocationMatch "/tutorial/logout">
Header always set Set-Cookie "JSESSIONID=;Path=/tutorial;Expires=Thu, 01 Jan 1970 00:00:00 GMT"
</LocationMatch>
  • 并发会话控制
如果您希望对单个用户登录到您的应用程序的能力进行限制,Spring Security通过以下简单的附加功能提供了开箱即用的支持 。首先,你需要将以下侦听器添加到你的web.xml文件中,以保持Spring Security关于会话生命周期事件的更新:
<listener><listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class></listener>然后将以下几行添加到你的应用程序上下文中:
<http>...<session-management><concurrency-control max-sessions="1" /></session-management></http>这将防止用户多次登录,第二次登录将导致第一次登录无效 。通常您希望防止第二次登录,在这种情况下您可以使用:
<http>...<session-management><concurrency-control max-sessions="1" error-if-maximum-exceeded="true" /></session-management></http>第二次登录将被拒绝 。通过“拒绝”,我们的意思是,如果使用基于表单的登录,用户将被发送到
authentication-failure-url 。如果第二次身份验证是通过另一种非交互机制进行的,比如“remember-me”,一个“unauthorized”(401)错误将被发送给客户端 。如果希望使用错误页面,可以将属性session-authentication-error-url添加到会话管理元素 。
如果您正在为基于表单的登录使用自定义身份验证过滤器,那么您必须显式地配置并发会话控制支持 。
  • 会话固定攻击保护
会话固定攻击是一个潜在的风险,在这种情况下,恶意攻击者可能通过访问一个站点来创建一个会话,然后说服另一个用户使用相同的会话登录(例如,通过向他们发送一个包含会话标识符作为参数的链接) 。Spring Security通过在用户登录时创建新会话或更改会话ID来自动防止这种情况发生 。如果您不需要这种保护,或者它与其他一些需求冲突,您可以使用<session-management>上的
session-fixation-protection属性来控制行为,该属性有四个选项: