我一直致力于使用spring security的应用程序。我对Spring安全性感到很陌生,最终遇到类似于this和this的问题。但它有点不同。
我以这种方式进行手动身份验证:
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, password);
Authentication authentication = this.authenticationProvider.authenticate(token);
SecurityContextHolder.getContext().setAuthentication(authentication);
当页面加载时,一切似乎都可以。但是,当我浏览应用程序时,似乎我松开了我的SecurityContext。 (如果用户已登录,我的状态栏显示用户名)
我以这种方式得到我的背景:
SecurityContextHolder.getContext()
在一些不正确的加载之后,有时候它会正确加载,因此上下文不会完全丢失。似乎我在一个会话中有几个上下文(我有HttpSessionListener和sessionCreated只触发一次)。我试着打印出上下文的对象哈希并注意到那里 是几个不同的哈希重复。只有一个是我的连接用户,其他人不是。
所以我假设在一个会话中有几个上下文(如果这是可能的话)。 我希望我能清楚地解释一切。 如果有人能给我一些帮助,我将不胜感激。
答案 0 :(得分:1)
对于你正在做的事情,上下文需要绑定到当前线程。因为,当你打电话
SecurityContextHolder.getContext()
返回ThreadLocal
商店的上下文。确保上下文与每个请求绑定到当前线程 (由于您没有描述如何执行此操作,因此无法说明。)
答案 1 :(得分:0)
最后我做到了! MarcelStör回答确实帮我找到了正确的keewords等等。谢谢。
问题是我在bean中设置了不知道安全过滤器链的SecurityContext。在@PostConstruct上调用它并且它不对。
我真正需要的是 PRE_AUTH_FILTER 以及正确的Spring安全配置。所以PRE_AUTH_FILTER在SpringSecurity过滤器链中正确放置认证对象。