Spring 安全性如何处理具有各种会话创建和会话固定组合的 JSESSIONID?



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

我正在使用基于 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
}
}

我真的只是想知道从春天那里得到什么行为,因为它与JSESSIONID有关,考虑到sessionCreationPolicysessionFixation的所有可能组合。

SessionCreationPolicy枚举中可能的值为ALWAYSNEVERIF_REQUIREDSTATELESS

会话固定的可能值为newSessionmigrateSessionchangeSessionIdnone

谢谢。

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

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

对于SessionCreationPolicy.IF_REQUIRED,文档指出:

Spring 安全性只会在需要时创建一个 HttpSession

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

  1. 使用您当前的配置,Spring 可以选择在需要时创建一个Session

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

如果要禁用 #1,请使用SessionCreationPolicy.NEVER

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

确保 Spring 安全性不使用会话的唯一SessionCreationPolicySessionCreationPolicy.STATELESS

关于会话固定,只有在身份验证后,当您为一个用户有多个会话时,它才会发挥作用。在这一点上,SessionCreationPolicy有些无关紧要。

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

会话固定:一旦您为用户设置了会话,如果用户再次登录,如何处理该会话

希望这有帮助!

最新更新