Java Spring安全上下文返回另一个用户

Java Spring安全上下文返回另一个用户,java,servlets,spring-security,Java,Servlets,Spring Security,我制作了一个servlet过滤器来进行自定义身份验证(基于apache在tomcat前面设置的头)。如果在安全上下文中已经有身份验证对象,我将使用它。 但是,在某些情况下,身份验证对象属于另一个用户,而不是发出请求的用户 我做错了什么? 是否有一种方法可以可靠地获取经过身份验证的用户,或者我应该始终在筛选器中进行身份验证? 如果我每次都要进行身份验证,那么创建一个新的身份验证对象(它是我的用户实体的包装器)可以吗,或者它会导致内存泄漏,所以我应该缓存这些对象 以下是守则的相关部分: @Servi

我制作了一个servlet过滤器来进行自定义身份验证(基于apache在tomcat前面设置的头)。如果在安全上下文中已经有身份验证对象,我将使用它。 但是,在某些情况下,身份验证对象属于另一个用户,而不是发出请求的用户

我做错了什么? 是否有一种方法可以可靠地获取经过身份验证的用户,或者我应该始终在筛选器中进行身份验证? 如果我每次都要进行身份验证,那么创建一个新的身份验证对象(它是我的用户实体的包装器)可以吗,或者它会导致内存泄漏,所以我应该缓存这些对象

以下是守则的相关部分:

@Service
public class RemoteAuthenticationFilter extends GenericFilterBean
    implements Filter {

  @Override
  public void doFilter(
      final ServletRequest req, final ServletResponse res,
      final FilterChain filterChain
  ) throws IOException, ServletException {
    final HttpServletRequest httpRequest = (HttpServletRequest) req;
    final SecurityContext context = SecurityContextHolder.getContext();
    if (
      context.getAuthentication() == null ||
          !context.getAuthentication().isAuthenticated()
    ) {
       //creating an Authentication in auth
       SecurityContextHolder.getContext().setAuthentication(auth);
    } else {
      // in this branch context.getAuthentication() sometimes returns another user
    }
    filterChain.doFilter(req, res);

  }

}

这是因为您从未清除过
SecurityContext
,并且由于它使用
ThreadLocal
存储身份验证,因此如果使用同一线程处理下一个请求,它仍然保留以前的身份验证


我建议您在
chain.doFilter(req,resp)
之后添加
SecurityContextHolder.clearContext()
,去掉
if-else
语句,只为每个请求创建一个新的身份验证。

我注意到,一旦完成处理,您就无法清除上下文。还有一个不发明自己的身份验证机制的原因。我应该在哪里以及如何做到这一点?在doFilter调用之后,通过将身份验证设置为未经身份验证的身份验证?