3

我有一个使用 Spring Security 4.0.1.RELEASE 的基于 J2EE REST 的 Web 应用程序。我正在使用基于 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 会话管理的文章后,我认为SessionManagementFilter过滤器应该运行在 Spring Security 的过滤器链中。但这绝对是。我可以在该类的doFilter方法中设置一个断点,它会在对服务器的每个请求上运行。

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

谢谢。

4

1 回答 1

5

使用 Spring Security 时,会话管理比在会话中存储经过身份验证的用户更广泛(如Spring Security 指南的会话管理部分所述)。

HTTP 会话相关功能由过滤器委托给SessionManagementFilter的接口和接口的组合处理。SessionAuthenticationStrategy典型用途包括会话固定保护攻击预防、会话超时检测以及对经过身份验证的用户可以同时打开多少会话的限制。

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

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

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

根据中断/失败的原因,您可能想要修复它而不是降低应用程序的安全性。

于 2018-06-13T16:51:41.487 回答