【问题标题】:How does Spring Security handle JSESSIONID with various Session Creation and Session Fixation combinations?Spring Security 如何处理具有各种 Session Creation 和 Session Fixation 组合的 JSESSIONID?
【发布时间】:2018-11-23 06:09:20
【问题描述】:

我有一个使用 Spring Security 4.0.1.RELEASE 的基于 J2EE REST 的应用程序。不用说,sessionCreationPolicysessionFixation 上的 Spring 文档很少,除了 StackOverflow 上的针对性问题。

我正在为 Spring Security 使用基于 Java 的配置,如下所示:

@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.IF_REQUIRED)
            .sessionFixation().migrateSession()
            .and()...; // additional config omitted for brevity
    }
}

鉴于sessionCreationPolicysessionFixation 的所有可能组合,我真的很想知道Spring 的预期行为,因为它与JSESSIONID 相关。

SessionCreationPolicy 枚举中的可能值为 ALWAYSNEVERIF_REQUIREDSTATELESS

会话固定的可能值为newSessionmigrateSessionchangeSessionIdnone

谢谢。

注意:提出这个问题的原因是当我将sessionCreationPolicy 设置为IF_REQUIRED 和@ 时,我没有在每个请求上看到一个新的JSESSIONID 987654339@ 设置为changeSessionIdJSESSIONID 已正确创建,但此后会在请求之间进行维护。我概括了我关于所有组合的问题,希望能帮助处于类似情况但设置略有不同的其他人。

【问题讨论】:

    标签: java spring jsessionid spring-session stateless


    【解决方案1】:

    请务必记住,Spring Security 并不总是完全控制 HttpSession。可以自己创建,也可以由容器提供Session对象。

    对于SessionCreationPolicy.IF_REQUIRED,文档状态:

    Spring Security 只会在需要时创建一个 HttpSession

    在您的特定情况下,您没有看到每个请求的新 JSESSIONID 至少有两个可能的原因:

    1. 使用您当前的配置,如果需要,Spring 可以选择创建 Session

    2. SessionCreationPolicy.IF_REQUIRED 似乎也允许 Spring Security 使用它提供的 Session。如果是这种情况,您的容器可能会提供此对象,因此会话会跨多个请求维护(如果您在会话中,这是预期的)。

    如果你想禁用#1,使用SessionCreationPolicy.NEVER:

    Spring Security 永远不会创建 HttpSession,但会使用已经存在的 HttpSession

    唯一可以确保 Spring Security 使用 NO SESSIONS 的 SessionCreationPolicySessionCreationPolicy.STATELESS

    关于 SessionFixation,它只有在您为一个用户拥有多个会话时才会发挥作用,并且需要经过身份验证。在这一点上,SessionCreationPolicy 有点无关紧要。

    SessionCreationPolicy:用于决定何时(如果有的话)创建一个新会话

    SessionFixation:一旦你有一个用户的会话,如果用户再次登录该会话如何处理

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2015-06-11
      • 2019-10-15
      • 1970-01-01
      • 2016-11-07
      • 2016-07-08
      • 1970-01-01
      • 2019-01-08
      • 2018-02-23
      • 2019-12-16
      相关资源
      最近更新 更多