【问题标题】:Spring SecurityContext gets "lost"Spring SecurityContext 得到“丢失”
【发布时间】:2013-09-24 20:49:04
【问题描述】:

我正在开发旧版应用程序(Spring 2.2.5、Spring Security 2.0.8)。身份验证由自定义 PreAuthenticationProcessingFilter 实现,其中 SecurityContext 填充有 Authentication 对象。这种身份验证在大多数地方都可用(无论是直接 SecurityContextHolder 调用,还是 AccessDecisionManager/AfterInvocationProvider 参数)。但是,有些地方 Authentication 对象(由 SecurityContextHolder 访问)为空。真正奇怪的是,这发生在单个 Http 请求中。 A 类获取 Authentication 对象,B 类,稍后在堆栈中调用得到 null。自然,这发生在同一个线程中,排除了对这个问题的最简单答案。看起来尽管线程是相同的 SecurityContextHolder 返回不同的 SecurityContext 对象(SecurityContext.toString() 返回不同的内存地址)。重要的是发生这种情况的地方不是您通常的 Spring bean。这是一个相当自定义的模块子系统,其中涉及自定义类加载器,我认为这可能与这种奇怪的效果有关。

所以问题是:除了产生不同的线程之外,还有什么会导致 SecurityContextHolder “丢失” SecurityContext 对象?

【问题讨论】:

    标签: java spring spring-mvc spring-security security-context


    【解决方案1】:

    这里的关键问题是使用 ThreadLocal 的 SecurityContextHolder 和使用自定义类加载器的子系统。 SecurityContextHolder 在类中调用,由自定义类加载器创建,将导致该类加载器加载 SecurityContextHolder 类并使用空上下文对其进行初始化,因此达到上述效果。

    简而言之,ThreadLocal 和自定义类加载器不能很好地混合,如下所述:

    Effect of ThreadLocals and side-by-side classloading

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-08
      • 2022-01-22
      • 2013-03-08
      • 2014-04-04
      • 2017-12-06
      • 1970-01-01
      • 2013-11-13
      • 2013-02-27
      相关资源
      最近更新 更多