Spring安全性和嵌套过滤器ChainProxy写入SAML服务提供程序

Spring安全性和嵌套过滤器ChainProxy写入SAML服务提供程序,spring,spring-security,saml-2.0,spring-saml,Spring,Spring Security,Saml 2.0,Spring Saml,我试图找出一个涉及Spring安全性和SAML的问题。我们正在尝试使用Spring安全性(Spring-Security-core-3.1.1.RELEASE.jar)和SAML(Spring-Security-saml2-core-1.0.0-RC1-SNAPSHOT.jar)将我们的产品修改为SAML SP。编辑:这是我的安全相关上下文xml的(我想!)相关部分。正如你所看到的,它几乎与 到目前为止,一切顺利。然后,我查看FilterChainProxy并发现: public void do

我试图找出一个涉及Spring安全性和SAML的问题。我们正在尝试使用Spring安全性(Spring-Security-core-3.1.1.RELEASE.jar)和SAML(Spring-Security-saml2-core-1.0.0-RC1-SNAPSHOT.jar)将我们的产品修改为SAML SP。编辑:这是我的安全相关上下文xml的(我想!)相关部分。正如你所看到的,它几乎与

到目前为止,一切顺利。然后,我查看FilterChainProxy并发现:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {
    try {
        doFilterInternal(request, response, chain);
    } finally {
        // SEC-1950
        SecurityContextHolder.clearContext();  <------- Key line here
    }
}
有了这个过滤器链,我不明白SecurityContextPersistenceFilter是如何工作的:似乎SecurityContextHolder总是在有机会持久化它之前被清除


这里有什么明显的问题吗?我是否误解了Spring Security中的某些内容(很可能!)

我无法得到任何明确的说明,但问题似乎在于Spring Security 3.1.1没有很好地与Spring SAML或任何使用相同类型嵌套FilterChainProxy的实现配合。看起来FilterChainProxy完全被3.1.1改写了。当我查看最新版本(3.1.4)时,我注意到finally子句中有一个复选框,如果它是过滤器的第一次调用,则只清除SecurityContextHolder(“SEC-1950”)


因此,将spring security升级到3.1.4解决了这个问题。

感谢您发布解决方案。我也面临着同样的问题,你的解决方案对我也有效。很高兴听到我不是唯一一个看到它的人。感谢您的关注!即使将spring security版本升级到3.1.4.0版,我也面临同样的问题。
SecurityContext contextBeforeChainExecution = repo.loadContext(holder);
try {
  SecurityContextHolder.setContext(contextBeforeChainExecution);
  chain.doFilter(holder.getRequest(), holder.getResponse());
} finally {
  SecurityContext contextAfterChainExecution = SecurityContextHolder.getContext();
  // Crucial removal of SecurityContextHolder contents - do this before anything else.
  SecurityContextHolder.clearContext();
  repo.saveContext(contextAfterChainExecution, holder.getRequest(), holder.getResponse());
  ....
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {
    try {
        doFilterInternal(request, response, chain);
    } finally {
        // SEC-1950
        SecurityContextHolder.clearContext();  <------- Key line here
    }
}
org.springframework.security.saml.metadata.MetadataGeneratorFilter@78104d3c
org.springframework.security.web.context.SecurityContextPersistenceFilter@168c795e
FilterChainProxy[ Filter Chains: [ .... my patterns ] ],
org.springframework.security.web.savedrequest.RequestCacheAwareFilter@7fffde92
org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@e2d09d7
org.springframework.security.web.authentication.AnonymousAuthenticationFilter@1c2b968f
org.springframework.security.web.session.SessionManagementFilter@395f222a
org.springframework.security.web.access.ExceptionTranslationFilter@372e6f09
org.springframework.security.web.access.intercept.FilterSecurityInterceptor@7dab91aa