代码之家  ›  专栏  ›  技术社区  ›  Matt Anxo P

为什么当我的会话创建策略设置为无状态时,spring security的sessionmanagementfilter会运行?

  •  0
  • Matt Anxo P  · 技术社区  · 6 年前

    我有一个基于j2ee rest的web应用程序,它使用spring security 4.0.1.release。我用基于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
            // ...
        }
        // ...
    }
    

    阅读后 this article 关于SpringSecurity会话管理,我相信 SessionManagementFilter 过滤器应该 在弹簧安全的过滤链上运行。但肯定是的。我可以在类的 doFilter 方法,并在对服务器的每个请求上运行。

    这是怎么回事?此筛选器正在运行的事实导致了我的应用程序中的其他意外行为,我认为这些行为已经配置好了。

    谢谢。

    1 回复  |  直到 6 年前
        1
  •  3
  •   s7vr    5 年前

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

    与http会话相关的功能由 SessionManagementFilter 以及 SessionAuthenticationStrategy 接口,筛选器委托给该接口。典型的用法包括会话固定保护攻击预防、检测会话超时和限制一个经过身份验证的用户可以同时打开多少会话。

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

    会话固定攻击的执行方式取决于配置的策略;默认情况下,在每个请求上更改会话标识符。在Servlet3.1和更新版本的容器中, ChangeSessionIdAuthenticationStrategy 如果未执行显式配置,则为默认值。在Servlet3.0和更低版本中,默认值是 migrateSession .

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

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