我开发了一个使用基于令牌的身份验证的无状态 REST API,我通过SecurityContextHolder.getContext().setAuthentication(authentication)
从自定义安全过滤器中调用手动将身份验证对象添加到安全上下文中。我一直遇到上下文设置不正确的问题,我认为这是由于:
在单个会话中接收并发请求的应用程序中,相同的 SecurityContext 实例将在线程之间共享。即使使用了 ThreadLocal,它也是从每个线程的 HttpSession 中检索到的同一个实例。如果您希望临时更改线程正在运行的上下文,这会产生影响。如果您只使用 SecurityContextHolder.getContext(),并在返回的上下文对象上调用 setAuthentication(anAuthentication),那么 Authentication 对象将在共享相同 SecurityContext 实例的所有并发线程中发生变化。...
您可以自定义 SecurityContextPersistenceFilter 的行为,为每个请求创建一个全新的 SecurityContext,防止一个线程中的更改影响另一个线程。
所以问题是 - 你如何改变 SecurityContextPersistenceFilter 的行为?
我希望安全上下文不与 http 会话相关联,但不想将会话创建策略设置为无状态,因为我仍然想实现 CSRF 保护等。