我有一个基于 J2EE REST 的应用程序,使用 Spring Security 4.0.1.RELEASE。不用说,关于sessionCreationPolicy
和sessionFixation
的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
有关,考虑到sessionCreationPolicy
和sessionFixation
的所有可能组合。
SessionCreationPolicy
枚举中可能的值为ALWAYS
、NEVER
、IF_REQUIRED
和STATELESS
。
会话固定的可能值为newSession
、migrateSession
、changeSessionId
和none
。
谢谢。
注意:提示此问题的原因是,当我将sessionCreationPolicy
设置为IF_REQUIRED
并将sessionFixation
设置为changeSessionId
时,我没有在每个请求上看到新的JSESSIONID
。JSESSIONID
已正确创建,但此后会在请求之间维护。我概括了我关于所有组合的问题,希望能帮助处于类似情况且设置略有不同的其他人。
重要的是要记住,Spring 安全性并不总是完全控制HttpSession
。它可以自己创建一个,但也可以由容器提供一个Session
对象。
对于SessionCreationPolicy.IF_REQUIRED
,文档指出:
Spring 安全性只会在需要时创建一个 HttpSession
在您的特定情况下,由于至少 2 个可能的原因,您没有看到每个请求的新 JSESSIONID:
-
使用您当前的配置,Spring 可以选择在需要时创建一个
Session
。 -
SessionCreationPolicy.IF_REQUIRED
似乎还允许Spring Security使用它提供的Session
。如果是这种情况,您的容器可能会提供此对象,因此会话在多个请求中维护(如果您在会话中,则会出现预期(。
如果要禁用 #1,请使用SessionCreationPolicy.NEVER
:
Spring Security 永远不会创建 HttpSession,但如果 HttpSession 已经存在,则会使用 HttpSession
确保 Spring 安全性不使用会话的唯一SessionCreationPolicy
是SessionCreationPolicy.STATELESS
。
关于会话固定,只有在身份验证后,当您为一个用户有多个会话时,它才会发挥作用。在这一点上,SessionCreationPolicy
有些无关紧要。
SessionCreationPolicy
:用于决定何时(如果有(创建新会话
会话固定:一旦您为用户设置了会话,如果用户再次登录,如何处理该会话
希望这有帮助!