当我的会话创建策略设置为STATELESS时,为什么Spring Security的SessionManagementFilter正在运行?

时间:2018-06-12 11:54:58

标签: java spring session spring-security stateless-session

我有一个基于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方法中设置断点,并在每次向服务器发出请求时运行。

这里发生了什么?此过滤器正在运行的事实导致我的应用程序中的其他意外行为,我认为已经配置了。

感谢。

1 个答案:

答案 0 :(得分:3)

使用Spring Security时,会话管理比将经过身份验证的用户存储在会话中更广泛(如“Spring安全指南”的Session Management Section中所述)。

  

HTTP会话相关功能由过滤器委托的SessionManagementFilterSessionAuthenticationStrategy接口的组合处理。典型用法包括会话固定保护攻击防范,会话超时检测以及经过身份验证的用户可以同时打开的会话数限制。

sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)并不意味着您的应用程序是无状态的,这意味着Spring Security不会创建会话。如果您的应用程序中还有其他内容仍在创建会话,Spring Security将尝试保护它免受会话固定攻击。

如何完成会话固定攻击取决于配置的策略;默认设置是更改每个请求的会话标识符。在Servlet 3.1和更新的容器中,如果没有进行显式配置,则ChangeSessionIdAuthenticationStrategy是默认值。在Servlet 3.0及更低版本中,默认值为migrateSession

您可以通过sessionFixation().none()禁用会话固定保护;但是,您必须质疑这是否是您真正想要的,这可能会使您的应用程序不那么安全。

根据中断/失败的原因,您可能希望修复它而不是使您的应用程序不那么安全。