SecurityContext中找不到Authentication对象

时间:2013-05-15 07:53:11

标签: spring authentication spring-security authorization security-context

  1. 我有一个导出Web服务的应用程序,配置了Spring Security SecurityFilterChain(其中包括SecurityContextPersistenceFilter,其余部分都需要)。
  2. 我的应用程序还使用Spring Security来保护方法调用。
  3. 触发方法安全时出现以下错误:

    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

2 个答案:

答案 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