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