如何自定义SecurityContextPersistenceFilter的行为?

问题描述 投票:12回答:1

我正在开发一种无状态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保护,等等。

multithreading spring-security spring-boot servlet-filters security-context
1个回答
0
投票

今天下午我有这个确切的问题,这个悬而未决的问题与我的搜索完全匹配,所以我想我会补充一点我学到的知识。

我们有正在访问相同SecurityContext的线程。我无法弄清楚如何直接自定义SecurityContextPersistenceFilter的行为(以及在框架的模式下),但是有两种方法可以使它成为线程安全的。

© www.soinside.com 2019 - 2024. All rights reserved.