0

我一直在研究使用弹簧安全的应用程序。我对 spring security 很陌生,最终遇到了类似于thisthis的问题。但它有点不同。

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

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

当页面加载时,一切似乎都正常。但是,当我在应用程序中导航时,似乎我失去了我的 SecurityContext。(如果用户登录,我有显示用户名的状态栏)

我这样得到我的上下文:

SecurityContextHolder.getContext()

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

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

4

2 回答 2

1

对于您正在执行的操作,上下文需要绑定到当前线程。因为,当你打电话

SecurityContextHolder.getContext()

ThreadLocal返回来自商店的上下文。确保每个请求的上下文都绑定到您当前的线程(无法提供更多信息,因为您没有描述您是如何做到的)。

于 2013-01-20T22:06:31.017 回答
0

最后我做到了!Marcel Stör的回答确实帮助我寻找正确的关键词等等。谢谢你。

问题是我在不知道安全过滤器链的 bean 中设置 SecurityContext。它是在@PostConstruct 上调用的,但它是不正确的。

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

于 2013-01-22T15:23:00.153 回答