Spring Security如何使用各种会话创建和会话固定组合处理JSESSIONID?

时间:2018-06-13 15:26:33

标签: java spring jsessionid spring-session stateless

我有一个使用Spring Security 4.0.1.RELEASE的基于J2EE REST的应用程序。毋庸置疑,除了StackOverflow上的目标问题之外,sessionCreationPolicysessionFixation上的Spring文档很少。

我正在使用基于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.IF_REQUIRED)
            .sessionFixation().migrateSession()
            .and()...; // additional config omitted for brevity
    }
}

考虑到JSESSIONIDsessionCreationPolicy的所有可能组合,我真的只想知道Spring对行为的期望,因为它与sessionFixation有关。

SessionCreationPolicy枚举中的可能值包括ALWAYSNEVERIF_REQUIREDSTATELESS

会话固定的可能值为newSessionmigrateSessionchangeSessionIdnone

谢谢。

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

1 个答案:

答案 0 :(得分:0)

重要的是要记住,Spring Security并不总是完全控制HttpSession。它可以自己创建一个,但也可以通过容器提供Session对象。

对于SessionCreationPolicy.IF_REQUIRED,文档声明:

  

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

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

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

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

  3. 如果您想禁用#1,请使用SessionCreationPolicy.NEVER

      

    Spring Security永远不会创建HttpSession,但如果它已经存在将使用HttpSession

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

    关于SessionFixation,只有在身份验证后为一个用户提供多个会话时才会发挥作用。此时,SessionCreationPolicy有点无关紧要。

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

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

    希望这有帮助!