通过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 (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...