一个HttpSession中的几个SecurityContexts

时间:2013-01-20 19:30:46

标签: authentication spring-security httpsession pre-authentication security-context

我一直致力于使用spring security的应用程序。我对Spring安全性感到很陌生,最终遇到类似于thisthis的问题。但它有点不同。

我以这种方式进行手动身份验证:

UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, password);
Authentication authentication = this.authenticationProvider.authenticate(token);
SecurityContextHolder.getContext().setAuthentication(authentication);

当页面加载时,一切似乎都可以。但是,当我浏览应用程序时,似乎我松开了我的SecurityContext。 (如果用户已登录,我的状态栏显示用户名)

我以这种方式得到我的背景:

SecurityContextHolder.getContext()

在一些不正确的加载之后,有时候它会正确加载,因此上下文不会完全丢失。似乎我在一个会话中有几个上下文(我有HttpSessionListener和sessionCreated只触发一次)。我试着打印出上下文的对象哈希并注意到那里  是几个不同的哈希重复。只有一个是我的连接用户,其他人不是。

所以我假设在一个会话中有几个上下文(如果这是可能的话)。 我希望我能清楚地解释一切。 如果有人能给我一些帮助,我将不胜感激。

2 个答案:

答案 0 :(得分:1)

对于你正在做的事情,上下文需要绑定到当前线程。因为,当你打电话

SecurityContextHolder.getContext()

返回ThreadLocal商店的上下文。确保上下文与每个请求绑定到当前线程 (由于您没有描述如何执行此操作,因此无法说明。)

答案 1 :(得分:0)

最后我做到了! MarcelStör回答确实帮我找到了正确的keewords等等。谢谢。

问题是我在bean中设置了不知道安全过滤器链的SecurityContext。在@PostConstruct上调用它并且它不对。

我真正需要的是 PRE_AUTH_FILTER 以及正确的Spring安全配置。所以PRE_AUTH_FILTER在SpringSecurity过滤器链中正确放置认证对象。