SecurityFilterChain
(其中包括SecurityContextPersistenceFilter
,其余部分都需要)。触发方法安全时出现以下错误:
org.springframework.security.authentication.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext
第二部分要求Authentication
SecurityContextHolder
org.springframework.security.access.intercept.AbstractSecurityInterceptor
,如SecurityContextHolder.getContext().getAuthentication();
所示(第195行):
SecurityContextPersistenceFilter
但是,org.springframework.security.web.context.SecurityContextPersistenceFilter
在触发方法调用之前将其删除,如图所示
SecurityContextHolder.clearContext();
(第84行)
SecurityContextHolder
触发方法调用时,如何在{{1}}中使用此对象?
提前谢谢。
我正在使用Spring Security 3.0.8-RELEASE
答案 0 :(得分:3)
SecurityContextHolder.clearContext()
。所以通常所有的应用程序逻辑代码都会在之前执行,并且完全没有问题。但是如果在代码中执行一些新线程,则可能存在问题(默认情况下,安全上下文不会被传播)。如果是这种情况,那么您可以try to force context propogation to child thread。如果您只使用一个线程,那么请确保所有代码都被Spring安全过滤器链覆盖(可能您有一些自定义过滤器执行围绕 Spring安全过滤器链?)。
答案 1 :(得分:0)
好的,我的应用程序放在Apache CXF DOSGi 1.4上以生成REST端点。 Apache CXF拦截器会导致意外行为,并在完成请求处理之前调用SecurityContextHolder.clearContext()
。
有关此错误的更多信息,请访问here。