我可以将敏感数据存储在 Quarkus 应用程序的 Vert.x 上下文中吗?

Can I store sensitive data in a Vert.x context in a Quarkus application?

我正在寻找一个地方来存储一些请求范围内的属性,例如使用 Quarkus 请求过滤器的用户 ID。我稍后想在日志处理程序中检索这些属性并将它们放入 MDC 日志记录上下文中。

Vertx.currentContext() 放置这样的请求属性的地方合适吗?或者我在这个上下文中设置的属性可以被其他请求读取吗?

如果这不是存储此类数据的正确位置,那么哪里才是正确的位置?

是...但不是 :-D Vertx.currentContext() 可以提供两种类型的对象:

  • 在此事件循环中执行的所有并发处理之间共享根上下文(因此不共享数据)
  • 重复上下文,对处理及其延续而言是本地的(您可以共享这些)

在 Quarkus 2.7.2 中,我们做了很多工作来改进对重复上下文的支持。之前,它们仅用于 HTTP,现在用于 gRPC 和 @ConsumeEvent。 Quarkus 2.8 中即将支持 Kafka 和 AMQP。

此外,在 Quarkus 2.7.2 中,我们引入了两个可能有用的新功能:

  1. 您不能将数据存储在根上下文中。我们会为您检测并抛出 UnsupportedOperationException。原因是安全。
  2. 我们引入了一个新的实用程序 class( io.smallrye.common.vertx.ContextLocals 以访问 context locals

这是一个简单的例子:

 AtomicInteger counter = new AtomicInteger();
public Uni<String> invoke() {
    Context context = Vertx.currentContext();

    ContextLocals.put("message", "hello");
    ContextLocals.put("id", counter.incrementAndGet());       

    return invokeRemoteService()
       // Switch back to our duplicated context:
        .emitOn(runnable -> context.runOnContext(runnable))
        .map(res -> {
            // Can still access the context local data
            String msg = ContextLocals.<String>get("message").orElseThrow();
            Integer id = ContextLocals.<Integer>get("id").orElseThrow();
            return "%s - %s - %d".formatted(res, msg, id);
        });
}