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

当会话固定保护发生时,它会导致在应用程序上下文中发布
SessionFixationProtectionEvent 。如果您使用changeSessionId,此保护也将导致任何javax.servlet.http. httpessionidlistener被通知,所以如果您的代码侦听这两个事件,请谨慎使用 。

  • SessionManagementFilter
SessionManagementFilter检查SecurityContextRepository的内容和反对的当前SecurityContextHolder内容是否在当前请求用户已经通过身份验证,通常由非交互式验证机制,如pre-authentication或remember-me 。如果存储库包含安全上下文,则过滤器不执行任何操作 。如果没有,并且本地线程SecurityContext包含一个(非匿名的)Authentication对象,那么过滤器假定它们已经通过堆栈中先前的过滤器进行了身份验证 。然后它将调用已配置的
SessionAuthenticationStrategy 。
如果用户当前没有经过身份验证,该过滤器将检查是否请求了一个无效的会话ID(例如,由于超时),并将调用配置的InvalidSessionStrategy(如果设置了一个) 。最常见的行为就是重定向到一个固定的URL,这被封装在标准实现
SimpleRedirectInvalidSessionStrategy中 。
  • SessionAuthenticationStrategy

SessionAuthenticationStrategy被SessionManagementFilter和AbstractAuthenticationProcessingFilter使用,所以如果你使用一个定制的表单登录类,例如,你将需要将它注入到这两个类中 。在这种情况下,结合命名空间和自定义bean的典型配置可能是这样的:
<http><custom-filter position="FORM_LOGIN_FILTER" ref="myAuthFilter" /><session-management session-authentication-strategy-ref="sas"/></http><beans:bean id="myAuthFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter"><beans:property name="sessionAuthenticationStrategy" ref="sas" />...</beans:bean><beans:bean id="sas" class="org.springframework.security.web.authentication.session.SessionFixationProtectionStrategy" />请注意,如果您将bean存储在实现httpessionbindinglistener的会话中(包括Spring会话范围内的bean),使用缺省的
SessionFixationProtectionStrategy可能会导致问题 。有关这个类的更多信息,请参阅Javadoc 。
  • Concurrency Control
Spring Security能够防止主体对同一应用程序的并发身份验证次数超过指定的次数 。许多isv利用这一点来实施许可,而网络管理员喜欢这个特性,因为它有助于防止人们共享登录名 。例如,您可以阻止用户“Batman”从两个不同的会话登录到web应用程序 。您可以使他们之前的登录失效,也可以在他们试图再次登录时报告错误,以防止第二次登录 。注意,如果您使用第二种方法,没有显式登出的用户(例如,刚刚关闭浏览器的用户)将不能再次登录,直到原始会话过期 。
命名空间支持并发控制,因此请检查前面的命名空间章节以获得最简单的配置 。但有时你需要定制一些东西 。
该实现使用了
SessionAuthenticationStrategy的一个特殊版本,称为ConcurrentSessionControlAuthenticationStrategy 。
以前,并发身份验证检查是由ProviderManager进行的,它可以被注入一个
ConcurrentSessionController 。后者将检查用户是否试图超过允许的会话数 。但是,这种方法要求预先创建HTTP会话,这是不可取的 。在Spring Security 3中,用户首先通过AuthenticationManager进行身份验证,一旦验证成功,将创建一个会话,并检查是否允许打开另一个会话 。




推荐阅读