当前位置: 首页 > 知识库问答 >
问题:

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

朱浩大
2023-03-14

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

客户机在每个请求中都包含一个JWT令牌,我编写的一个自定义过滤器扩展了GenericFilterBean,它使用以下内容将基于令牌中声明的身份验证对象添加到安全上下文中:

SecurityContextHolder.getContext().setAuthentication(authentication);

并在处理请求后通过执行以下操作清除上下文:

SecurityContextHolder.getContext().setAuthentication(null);

但是,当我开发的简单应用程序执行一系列操作时,我有时会看到安全上下文设置不正确——有时对于提供了令牌的请求来说它为空。过滤器被正确调用,setAuthencation()也被调用,但请求身份验证失败,并抛出403拒绝。

如果我通过将会话创建策略设置为STATELESS来显式关闭任何超文本传输协议会话管理,则此行为会停止。

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

共有1个答案

谭骏
2023-03-14

根据这里的官方文件,似乎可以共享上下文:http://docs.spring.io/spring-security/site/docs/3.1.x/reference/springsecurity-single.html

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

 类似资料:
  • 问题内容: 我正在使用Python模块(PyCLIPS)和Django 1.3。 我想开发一个线程安全类,该类可实现对象池和Singleton模式,并且还必须在Django中的请求之间共享。 例如,我要执行以下操作: 请求从池中获取具有某些ID的对象,对其进行处理,然后将其推回池中,然后发送带有对象ID的响应。 另一个具有对象ID的请求从池中获取具有给定ID的对象,并重复上述请求中的步骤。 但是对

  • 问题内容: 我有一个关于JAX-RS的非常基本的问题,但我无法以某种方式轻易找到答案。 我正在尝试将使用“标准” Javax servlet的REST服务重构为“手工”将请求路由到方法的“ REST服务”,使其成为“更干净的” JAX- RS实现。当前应用程序在servlet init()期间设置一些变量。它将那些属性分配为HttpServlet类的属性,因此它们在每个doGet()期间都可用,并

  • 我在Spring控制器的2个webservice中使用了相同的ArrayList,所以我想使用请求或会话范围从DB中获取一次,我尝试制作一个bean } 在控制器中 application context CTX = new AnnotationConfigApplicationContext(example bean。类);AttendeesBean attendee bean = CTX .

  • 问题内容: 我在一个具有不同进程的应用程序上工作,并被要求包含那些进程以实现更多隔离。 问题在于,进程与单个“管理程序”进程共享内存以便交换数据(它们使用经典的共享缓冲区)。该解决方案是为满足性能要求而实施的,因为它在用户空间中运行,因此在用户空间和内核空间之间没有内容切换。 如果我没看错,则不可能在单个IPC名称空间内运行多个docker容器,但是我不知道单个docker容器是否可能属于不同的I

  • 问题内容: 我在同一页面上有两个不同的应用程序。 我可以通过服务(或其他方式)在这两个应用之间共享数据吗? 还是不可能? (我怀疑这是不可能通过常规的角度机构实现的)-但我认为仍然值得提出… 可以使用window变量完成此操作-但我要避免这样做。 谢谢! 问题答案: 我最终以以下方式解决了该问题: 我必须承认这一解决方案并不理想,但这是我找到的最干净的解决方案。

  • 问题内容: 有什么方法可以在node.js的客户端和服务器之间共享数据(包括对象)?我曾经依赖于为此目的而设计的模块now.js,但是该项目已经停产了,我正在寻找替代品。现在now.js被放弃了,还有没有其他方法可以在客户端和服务器之间无缝同步变量? 问题答案: 在now.js之后,两个最接近的竞争者是shareJS和dnode: http://sharejs.org/ https://githu