我有一个基于J2EE REST的Web应用程序,它使用Spring Security 4.0.1.RELEASE。我正在使用基于Java的配置配置Spring Security,并将会话创建策略设置为STATELESS,如下所示:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(secureEnabled=true, prePostEnabled=true, jsr250Enabled=true, order=1)
public class DefaultSecurityBeansConfig extends WebSecurityConfigurerAdapter {
// ...
@Override
protected void configure(HttpSecurity http) throws Exception {
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()...; // additional config omitted for brevity
// ...
}
// ...
}
在阅读有关Spring Security会话管理的this article后,我认为SessionManagementFilter
过滤器应该不在Spring Security的过滤器链中运行。但它绝对是。我可以在该类的doFilter
方法中设置断点,并在每次向服务器发出请求时运行。
这里发生了什么?此过滤器正在运行的事实导致我的应用程序中的其他意外行为,我认为已经配置了。
感谢。
答案 0 :(得分:3)
使用Spring Security时,会话管理比将经过身份验证的用户存储在会话中更广泛(如“Spring安全指南”的Session Management Section中所述)。
HTTP会话相关功能由过滤器委托的
SessionManagementFilter
和SessionAuthenticationStrategy
接口的组合处理。典型用法包括会话固定保护攻击防范,会话超时检测以及经过身份验证的用户可以同时打开的会话数限制。
说sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
并不意味着您的应用程序是无状态的,这意味着Spring Security不会创建会话。如果您的应用程序中还有其他内容仍在创建会话,Spring Security将尝试保护它免受会话固定攻击。
如何完成会话固定攻击取决于配置的策略;默认设置是更改每个请求的会话标识符。在Servlet 3.1和更新的容器中,如果没有进行显式配置,则ChangeSessionIdAuthenticationStrategy
是默认值。在Servlet 3.0及更低版本中,默认值为migrateSession
。
您可以通过sessionFixation().none()
禁用会话固定保护;但是,您必须质疑这是否是您真正想要的,这可能会使您的应用程序不那么安全。
根据中断/失败的原因,您可能希望修复它而不是使您的应用程序不那么安全。