当我的会话创建策略设置为无状态时,为什么 Spring 安全的 SessionManagementFilter 运行?

Why is Spring Security's SessionManagementFilter running when my session creation policy is set to STATELESS?

我有一个基于 J2EE REST 的 Web 应用程序,它使用 Spring Security 4.0.1.RELEASE。我正在使用基于 Java 的配置配置 Spring 安全性,并将会话创建策略设置为无状态,如下所示:

@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
        // ...
    }
    // ...
}

阅读 this article 关于 Spring 安全会话管理后,我认为 SessionManagementFilter 过滤器应该 而不是 运行在 Spring 安全的过滤器链中 ning。但它绝对是。我可以在那个 class 的 doFilter 方法中设置一个断点,它是 运行 对服务器的每个请求。

这是怎么回事?这个过滤器是 运行ning 的事实导致我的应用程序出现其他我认为已被配置掉的意外行为。

谢谢。

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

HTTP session related functionality is handled by a combination of the SessionManagementFilter and the SessionAuthenticationStrategy interface, which the filter delegates to. Typical usage includes session-fixation protection attack prevention, detection of session timeouts and restrictions on how many sessions an authenticated user may have open concurrently.

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

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

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

根据 breaks/fails 的情况,您可能希望修复该问题,而不是降低您的应用程序的安全性。