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