gpt4 book ai didi

spring - 在 Kotlin Flow 中使用 ReactiveSecurityContextHolder

转载 作者:行者123 更新时间:2023-12-02 18:32:31 24 4
gpt4 key购买 nike

我正在使用 Kotlin 开发 Spring Boot (2.2) 项目,并使用 CouchDB 作为(响应式(Reactive))数据库,因此使用异步 DAO(挂起函数或返回 Flow 的函数)。我正在尝试设置 WebFlux 以便也拥有异步 Controller (同样,我想返回 Flows,而不是 Flux)。但我在从 ReactiveSecurityContextHolder 检索我的安全上下文时遇到问题。

据我所知,与 SecurityContextHolder 不同正在使用 ThreadLocal存储它,ReactiveSecurityContextHolder依赖于这样一个事实:Spring 在订阅我的 react 链时,还将该上下文存储在该链中,从而允许我调用 ReactiveSecurityContextHolder.getContext()从链条内部。

问题是我必须改变我的Mono<SecurityContext>在某个时刻进入流程,这让我失去了我的SecurityContext 。所以我的问题是:有没有办法让 Spring Boot Controller 在从 ReactiveSecurityContextHolder 检索安全上下文时返回 Flow在我的逻辑里面?基本上,简化后应该是这样的:

@GetMapping
fun getArticles(): Flow<String> {
return ReactiveSecurityContextHolder.getContext().flux().asFlow() // returns nothing
}

请注意,如果我直接返回 Flux(跳过 .asFlow() ),或者添加 .single().toList()最后(因此使用 suspend fun ),那么它工作正常并且返回我的安全上下文,但这又不是我想要的。我猜解决方案是将上下文从 Flux (初始 react 链从 ReactiveSecurityContextHolder )转移到 Flow,但默认情况下似乎没有这样做。

编辑:这是一个展示问题的示例项目:https://github.com/Simon3/webflux-kotlin-sample

最佳答案

您真正想要实现的是从 Flow 内部访问您的 ReactorContext。

实现此目的的一种方法是放松返回 Flow 的需要并返回 Flux。这允许您恢复 ReactorContext 并将其传递给您将用于生成数据的 Flow。

@ExperimentalCoroutinesApi
@GetMapping("/flow")
fun flow(): Flux<Map<String, String>> = Mono.subscriberContext().flatMapMany { reactorCtx ->
flow {
val ctx = coroutineContext[ReactorContext.Key]?.context?.get<Mono<SecurityContext>>(SecurityContext::class.java)?.asFlow()?.single()
emit(mapOf("user" to ((ctx?.authentication?.principal as? User)?.username ?: "<NONE>")))
}.flowOn(reactorCtx.asCoroutineContext()).asFlux()
}

如果您需要从挂起方法访问 ReactorContext,您可以简单地从 coroutineContext 获取它,无需进一步的技巧:

@ExperimentalCoroutinesApi
@GetMapping("/suspend")
suspend fun suspend(): Map<String,String> {
val ctx = coroutineContext[ReactorContext.Key]?.context?.get<Mono<SecurityContext>>(SecurityContext::class.java)?.asFlow()?.single()
return mapOf("user" to ((ctx?.authentication?.principal as? User)?.username ?: "<NONE>"))
}

关于spring - 在 Kotlin Flow 中使用 ReactiveSecurityContextHolder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59050089/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com