由于您正在使用WebFlux,因此您将使用事件循环来处理请求。您不再像Tomcat那样使用每个请求线程模型。
身份验证按上下文存储。
,当请求到达时,Spring将 存储在中SecurityContextHolder
。SecurityContextHolder
使用ThreadLocal
变量存储 。仅当您尝试从设置了 对象ThreadLocal
的同一线程中的对象中获取特定 对象时,该 对象才对您可见。这就是为什么您可以通过静态调用在控制器中获得 原因。ThreadLocal对象知道返回给您什么,因为它知道您的上下文- 您的线程。
,您可以仅使用1个线程来处理所有请求。像这样的静态调用将不再返回预期结果:
SecurityContextHolder.getContext().getAuthentication();
因为不再有使用ThreadLocal对象的方法。为您获取身份验证的唯一方法是在控制器的方法签名中要求身份验证,或者…
从正在ReactiveSecurityContextHolder.getContext()
调用的方法返回反应链。
由于您要返回一连串的反应式运算符,因此Spring会对您的链进行订阅以便执行它。当Spring执行此操作时,它将为整个链提供安全上下文。因此,ReactiveSecurityContextHolder.getContext()
该链中的每个调用都将返回预期的数据。