【发布时间】:2018-11-21 19:35:00
【问题描述】:
我有一个使用 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
// ...
}
// ...
}
在阅读了this article 关于 Spring Security 会话管理的内容后,我相信 SessionManagementFilter 过滤器应该不在 Spring Security 的过滤器链中运行。但这绝对是。我可以在该类的 doFilter 方法中设置断点,它会在对服务器的每个请求上运行。
这里发生了什么?这个过滤器正在运行的事实导致了我的应用程序中的其他意外行为,我认为这些行为已经被配置了。
谢谢。
【问题讨论】:
-
你的理解是错误的。它仍然会运行,但不会创建会话或在会话中存储内容。将有一个
SessionManagementFilter和一个NullSecurityContextRepository不会存储它。所以基本上它会一直运行,但取决于配置它会做些什么。 -
好吧,这有点道理。但是当它运行时,它几乎不是空操作。
doFilter方法调用onAuthentication方法,该方法已将ChangeSessionIdAuthenticationStrategy注册为其唯一的委托策略。这似乎与我的STATELESS会话创建策略相冲突。我没有明确设置会话固定策略,如果我没记错的话将默认为migrateSession,但这种行为意味着我以某种方式使用changeSessionId。我最终可能会针对这些发现发布一个新问题。 -
这不应该是一个问题,因为您没有创建会话(至少 Spring Security 没有创建会话,这并不意味着没有其他东西在创建会话! ) 这基本上应该是一个 noop。由于该策略首先检查是否已经存在会话,如果没有,则什么也不做。 Spring Security 在无状态模式下运行的事实并不意味着您的应用程序的其余部分会自动变为无状态!
-
可以肯定的是,我的应用程序正在使用始终运行的 servlet 过滤器 (
((HttpServletRequest) request).getSession()) 创建会话。而这个正在运行的ChangeSessionIdAuthenticationStrategy不断改变我的JSESSIONID。根据 Spring 文档,SessionCreationPolicy的 NEVER 值应该使用HttpSession(如果存在),而 STATELESS 值“将永远不会创建 HttpSession 并且永远不会使用它来获取SecurityContext”。对我来说,这听起来不应该与我的 JSESSIONID 混淆。我真的很困惑为什么它会干扰。 -
这是有干扰的,因为在无状态模式下运行和防止会话固定攻击是两件不同的事情。这里发生的是 Spring Security 检测会话,默认情况下,用于防止会话劫持的安全性是更改会话 ID。如果您不希望通过
sessionFixation().none()将其指定为无。但是,这将使您的应用程序不那么安全并且容易受到会话固定攻击。我不明白为什么更改 sessionid 会破坏事情,修复破坏的内容而不是降低您的应用程序的安全性。
标签: java spring session spring-security stateless-session