Meg*_*att 2 java session spring spring-security stateless-session
我有一个使用 Spring Security 4.0.1.RELEASE 的基于 J2EE REST 的 Web 应用程序。我正在使用基于 Java 的配置配置 Spring Security,并将会话创建策略设置为 STATELESS,如下所示:
@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
// ...
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
在阅读了这篇关于 Spring Security 会话管理的文章后,我认为SessionManagementFilter过滤器不应该运行在 Spring Security 的过滤器链中。但它绝对是。我可以在那个类中设置断点doFilter方法中,它会在对服务器的每个请求上运行。
这里发生了什么?此过滤器正在运行的事实导致我的应用程序中出现其他意外行为,我认为这些行为已被配置掉。
谢谢。
使用 Spring Security 时,会话管理比在会话中存储经过身份验证的用户更广泛(如Spring Security Guide的会话管理部分所述)。
HTTP 会话相关功能由
SessionManagementFilter和SessionAuthenticationStrategy接口的组合处理,过滤器委托给该接口。典型用途包括会话固定保护攻击预防、会话超时检测以及对经过身份验证的用户可能同时打开的会话数量的限制。
sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)这么说并不意味着您的应用程序是无状态的,而是意味着 Spring Security 不会创建会话。如果您的应用程序中还有其他东西仍在创建会话,Spring Security 将尝试保护它免受会话固定攻击。
如何进行会话固定攻击取决于配置的策略;默认是更改每个请求的会话标识符。在 Servlet 3.1 和更新的容器中,ChangeSessionIdAuthenticationStrategy如果未进行显式配置,则为默认值。在 Servlet 3.0 及以下版本中,默认值为migrateSession.
您可以通过执行以下操作禁用会话固定保护sessionFixation().none();但是,您必须质疑这是否是您真正想要的,因为这可能会降低您的应用程序的安全性。
根据中断/失败的原因,您可能希望修复该问题,而不是降低应用程序的安全性。