【发布时间】: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