java为什么我的会话创建策略设置为无状态时Spring Security的SessionManagementFilter会运行?
我有一个基于J2EE REST的web应用程序,它使用Spring Security 4.0.1。释放我正在使用基于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.STATELESS).and()...; // additional config omitted for brevity
// ...
}
// ...
}
在阅读了关于Spring安全会话管理的this article之后,我认为SessionManagementFilter
过滤器应该而不是在Spring安全的过滤器链中运行。但确实如此。我可以在该类的doFilter
方法中设置一个断点,它会在服务器的每个请求上运行
这是怎么回事?这个过滤器正在运行的事实导致了我的应用程序中的其他意外行为,我认为这些行为已经被配置掉了
谢谢
# 1 楼答案
使用Spring安全性时,会话管理比在会话中存储经过身份验证的用户更广泛(如Spring安全指南的Session Management Section中所述)
说
sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
并不意味着应用程序是无状态的,它意味着Spring安全性不会创建会话。如果应用程序中还有其他内容仍在创建会话,Spring Security将尝试保护它免受会话固定攻击会话固定攻击的执行方式取决于配置的策略;默认设置是更改每个请求的会话标识符。在Servlet 3.1和更新的容器中,如果没有进行显式配置,
ChangeSessionIdAuthenticationStrategy
是默认值。在Servlet3.0及以下版本中,默认值为migrateSession
您可以通过执行
sessionFixation().none()
来禁用会话固定保护;但是,您必须质疑这是否是您真正想要的,因为这可能会降低应用程序的安全性根据哪些中断/故障,您可能希望修复这些问题,而不是降低应用程序的安全性