有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么我的会话创建策略设置为无状态时Spring Security的SessionManagementFilter会运行?

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

@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安全会话管理的this article之后,我认为SessionManagementFilter过滤器应该而不是在Spring安全的过滤器链中运行。但确实如此。我可以在该类的doFilter方法中设置一个断点,它会在服务器的每个请求上运行

这是怎么回事?这个过滤器正在运行的事实导致了我的应用程序中的其他意外行为,我认为这些行为已经被配置掉了

谢谢


共 (1) 个答案

  1. # 1 楼答案

    使用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 Security将尝试保护它免受会话固定攻击

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

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

    根据哪些中断/故障,您可能希望修复这些问题,而不是降低应用程序的安全性