栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

身份验证按上下文存储。

使用Tomcat ,当请求到达时,Spring将 身份验证 存储在中

SecurityContextHolder

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

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

SecurityContextHolder.getContext().getAuthentication();

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

从正在

ReactiveSecurityContextHolder.getContext()
调用的方法返回反应链。

由于您要返回一连串的反应式运算符,因此Spring会对您的链进行订阅以便执行它。当Spring执行此操作时,它将为整个链提供安全上下文。因此,

ReactiveSecurityContextHolder.getContext()
该链中的每个调用都将返回预期的数据。

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/515253.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号