【问题标题】:Several SecurityContexts in one HttpSession一个 HttpSession 中的多个 SecurityContexts
【发布时间】:2013-01-03 21:40:38
【问题描述】:

我一直在研究使用 Spring Security 的应用程序。我对 Spring Security 很陌生,最终遇到了类似于 thisthis 的问题。但是有点不一样。

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

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

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

我通过这种方式了解我的上下文:

SecurityContextHolder.getContext()

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

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

【问题讨论】:

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


    【解决方案1】:

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

    SecurityContextHolder.getContext()
    

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

    【讨论】:

    • 谢谢,现在我,至少,有一些东西可以坚持。我仍然不确定如何解决这个问题。 “确保每个请求的上下文都绑定到您当前的线程(无法提供更多信息,因为您没有描述您是如何做到的)。” 问题是我没有这样做.我以为春天会解决这个问题。你还想让我描述什么。
    • @VytautasAlkimavičius,“我认为春天会解决这个问题。” - 是的,Spring 确实 会处理这个问题,因为它设置正确。您的问题没有暗示您拥有哪些 Spring 配置/基础设施。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-11-27
      • 1970-01-01
      • 2021-09-13
      • 1970-01-01
      • 2011-01-09
      • 2011-07-02
      • 2013-08-17
      • 2011-01-05
      • 2011-12-12
      相关资源
      最近更新 更多