如何解决通过coRouter,弹簧通量和协程上下文获取请求正文
我有这段(工作)代码,在大量的挖掘之后,我找到了一种访问请求正文的通量DataBuffer
的方法,因此我可以将其解析为记录的Map
并然后进一步处理。我正在寻找一种更清洁的方法。
面临的挑战是,我有一个WebFilter
,它在反应堆上下文中设置了安全上下文,然后可以从路由器创建的协同例程作用域中访问它。我们用它来在我们的业务逻辑中执行授权检查。
csvToMap函数仅使用opencsv将Spring Databuffer
转换为记录映射。我发现到达此数据缓冲区的唯一方法是通过Flux
主体函数,该函数以BodyExtractor
lambda作为参数。
问题在于此回调当然不在协同例程范围内,并且如果使用例如,不会收到路由器功能顶层中的相同上下文。 runBlocking
。理想情况下,我可以直接从ServerRequest获取缓冲区作为Flow,然后使用map
函数通过单个暂停函数对其进行转换。
在下面的代码中,我首先通过处理在主体处理器中访问的数据缓冲区(不进行任何身份验证检查),然后在Flow
中对其进行处理,来解决此问题。在Flow的map函数中,我获得了安全上下文,因此可以在processCsvRecords
中进行身份验证检查。
coRouter {
POST("/users/csv") {
// here we are in a co-routine scope with access to
// the security context our webfilter sets
val resp = it.body { req,_ ->
// this flux callback is not part of the co-routine scope anymore
// so I lose my security context here
req.body.map { buffer ->
// here we finally get the buffer and we can do
// something with it
csvToMap(buffer)
}
}.asFlow().map { records ->
// here we are back in scope and processCsvRecords can check auth
userCsvImporter.processCsvRecords(records)
}
ok().bodyAndAwait(resp)
}
}
不要介意这个设计;我们没有使用spring-security,也没有计划。我们拥有的自定义安全性超出了此处讨论的范围。但是这里的一般想法是,我们根据业务逻辑中的安全上下文检查特权。
我对到达请求正文的更清洁的替代方法感兴趣。我在这里缺少什么吗?还是目前最好的方法?
我的感觉是,对Flux的常规支持在这里缺少一些东西。理想情况下,我希望从继承自协同路由器的协同例程作用域的流中访问请求正文,这样就不必像在这里那样弄乱Flux内部。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com(将#修改为@)