我正在开发一种无状态REST API,该API利用基于令牌的身份验证,其中我是通过在自定义安全过滤器中调用SecurityContextHolder.getContext().setAuthentication(authentication)
手动将Authentication对象添加到安全上下文中的。我一直在遇到上下文设置不正确的问题,我认为这是由于此而引起的:
Storing the SecurityContext between requests
在单个会话中接收并发请求的应用程序中,相同的SecurityContext实例将在线程之间共享。即使正在使用ThreadLocal,它也是从HttpSession中为每个线程检索的实例。如果您希望临时更改线程在其下运行的上下文,则可能会产生影响。如果只使用SecurityContextHolder.getContext(),并在返回的上下文对象上调用setAuthentication(anAuthentication),则Authentication对象将在共享同一SecurityContext实例的所有并发线程中更改。 ...
您可以自定义SecurityContextPersistenceFilter的行为,为每个请求创建一个全新的SecurityContext,以防止一个线程中的更改影响另一个线程。
所以问题是-您如何更改SecurityContextPersistenceFilter的行为?
我希望安全上下文不与http会话相关联,但是不想将会话创建策略设置为无状态,因为我仍然想实现CSRF保护,等等。
今天下午我有这个确切的问题,这个悬而未决的问题与我的搜索完全匹配,所以我想我会补充一点我学到的知识。
我们有正在访问相同SecurityContext的线程。我无法弄清楚如何直接自定义SecurityContextPersistenceFilter的行为(以及在框架的模式下),但是有两种方法可以使它成为线程安全的。