Authentication 使用Spring Security时,请求之间是否共享SecurityContext?

Authentication 使用Spring Security时,请求之间是否共享SecurityContext?,authentication,spring-security,thread-safety,spring-boot,security-context,Authentication,Spring Security,Thread Safety,Spring Boot,Security Context,在使用SpringBoot编写的RESTAPI上使用基于无状态令牌的身份验证时,我看到了一些奇怪的行为 客户端在每个请求中都包含一个JWT令牌,我编写的一个自定义筛选器扩展了GenericFilterBean,它使用以下内容根据令牌中的声明向安全上下文添加一个身份验证对象: SecurityContextHolder.getContext().setAuthentication(authentication); 并在处理请求后通过执行以下操作清除上下文: SecurityContextHold

在使用SpringBoot编写的RESTAPI上使用基于无状态令牌的身份验证时,我看到了一些奇怪的行为

客户端在每个请求中都包含一个JWT令牌,我编写的一个自定义筛选器扩展了GenericFilterBean,它使用以下内容根据令牌中的声明向安全上下文添加一个身份验证对象:

SecurityContextHolder.getContext().setAuthentication(authentication);
并在处理请求后通过执行以下操作清除上下文:

SecurityContextHolder.getContext().setAuthentication(null);
然而,当我开发的简单应用程序执行一系列操作时,我有时会发现安全上下文设置不正确——有时对于提供令牌的请求,安全上下文设置为null。正在正确调用筛选器,也正在调用setAuthEnAction(),但请求身份验证失败,并抛出403拒绝

如果通过将会话创建策略设置为无状态来显式关闭任何http会话管理,则此行为将停止


你知道这里会发生什么吗?安全上下文是否以某种方式在处理请求的线程之间共享?

根据此处的官方文档,似乎可以共享该上下文:

在单个会话中接收并发请求的应用程序中,相同的SecurityContext实例将在线程之间共享。即使正在使用ThreadLocal,但每个线程都是从HttpSession检索的同一实例。如果您希望临时更改线程运行的上下文,这将产生影响。如果只使用SecurityContextHolder.getContext(),并对返回的上下文对象调用setAuthentication(anAuthentication),则共享同一SecurityContext实例的所有并发线程中的身份验证对象都将更改。您可以自定义SecurityContextPersistenceFilter的行为,为每个请求创建一个全新的SecurityContext,以防止一个线程中的更改影响另一个线程。或者,您可以在临时更改上下文的位置创建一个新实例。方法SecurityContextHolder.createEmptyContext()始终返回新的上下文实例

你检查过这个了吗?