[halo-dev/halo]在Watch中我无法通过ReactiveSecurityContextHolder获取当前用户

2024-03-18 581 views
3
是什么版本出现了此问题?

2.4

使用的什么数据库?

MySQL 8.x

使用的哪种方式部署?

Docker Compose

在线站点地址

No response

发生了什么?

在本地开发插件,添加 Watch 类监控 Policy 新增事件,在 Wathch 类的 onAdd 方法中使用如下代码获取执行新增的操作人名 ReactiveSecurityContextHolder.getContext() .map(SecurityContext::getAuthentication) .map(Authentication::getName) 就是拿不到真正的用户名,debug 得到的是 Context0 我翻阅了几乎所有的插件库但没有找到使用过 ReactiveSecurityContextHolder.getContext() 的代码库作为参考。 而我在本地调试了好几个晚上了还是没拿到用户名,我感觉在JDK17的Mono与Flux中调试太困难了,而且插件代码也无法debug。 具体代码在 https://github.com/guicaiyue/halo-plugin/blob/main/src/main/java/run/halo/oss/GitHubPolicyHandler.java 这里。 我需要帮助,希望能通过 ReactiveSecurityContextHolder 获取用户名,而不是通过再加一个字段新增存储策略时填写用户名。

相关日志输出

No response

附加信息

No response

回答

3

通过 Watcher 获取用户名应该是不可行的。因为调用 Client 的不一定是用户主动触发的,Reconciler 也有可能会直接调用,这样就没有认证信息,也就获取不到当前登录用户名。

目前能获取用户名的地方在 RouterFunction 的 HandlerFunction 中,这是比较靠谱的。

目前插件代码调试确实比较麻烦,不过我们会慢慢优化,有任何想法都可以提出来,一起完善。

Reactor 调试请参考:https://projectreactor.io/docs/core/release/reference/#debugging

/kind support

2

你的意思是Watcher获取用户名可能不行,但可以在 RouterFunction 的 HandlerFunction 中获取的意思吗?我查了下 RouterFunction 是用来控制路由的吧,能更详细说下怎么使用 HandlerFunction 拿到当前用户名嘛。

8

我已经再次尝试将此代码写入,但仍然不能拿到用户名 ReactiveSecurityContextHolder.getContext()的结果是空的 下面是我的使用方式截图 image

9

Hi @guicaiyue ,之前已经提到过了,只能在请求链上调用 ReactiveSecurityContextHolder.getContext() 才会有结果。

4

好的