您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

ReactiveSecurityContextHolder.getContext()为空,但@AuthenticationPrincipal有效

ReactiveSecurityContextHolder.getContext()为空,但@AuthenticationPrincipal有效

由于您正在使用WebFlux,因此您将使用事件循环来处理请求。您不再像Tomcat那样使用每个请求线程模型。

身份验证按上下文存储。

,当请求到达时,Spring将 存储在中SecurityContextHolderSecurityContextHolder使用ThreadLocal变量存储 。仅当您尝试从设置了 对象ThreadLocal的同一线程中的对象中获取特定 对象时,该 对象才对您可见。这就是为什么您可以通过静态调用在控制器中获得 原因。ThreadLocal对象知道返回给您什么,因为它知道您的上下文- 您的线程。

,您可以仅使用1个线程来处理所有请求。像这样的静态调用将不再返回预期结果:

SecurityContextHolder.getContext().getAuthentication();

因为不再有使用ThreadLocal对象的方法。为您获取身份验证的唯一方法是在控制器的方法签名中要求身份验证,或者…

从正在ReactiveSecurityContextHolder.getContext()调用方法返回反应链。

由于您要返回一连串的反应式运算符,因此Spring会对您的链进行订阅以便执行它。当Spring执行此操作时,它将为整个链提供安全上下文。因此,ReactiveSecurityContextHolder.getContext()该链中的每个调用都将返回预期的数据。

您可以在此处阅读有关Mono / Flux上下文的更多信息,因为它是Reactor特有的功能

其他 2022/1/1 18:17:03 有521人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶