当您有 2 个单独的主题时配置 'sasl.jaas.config',每个主题都有单独的连接密钥?

Configuration of 'sasl.jaas.config' when you have 2 separate topics, each having separate connection key?

当您有 2 个单独的主题时,我正在寻找有关 sasl.jaas.config 配置的说明,每个主题都有单独的连接密钥?我正在使用 spring-cloud-starter-stream-kafka 版本 3.1。我没有使用 spring-cloud-stream-binder-kafka 并且我不知道是否 that would solve my problem.

当只涉及 1 个主题时,我可以找到很多示例,使用 spring.cloud.stream.kafka.binder.configuration 中由消费者继承的“通用配置”进行连接。

我有一个场景,我有一个输入和输出,每个都有自己单独的主题,我想在 .yml 中配置它。这可以通过 .yml 配置实现吗?

我最好的猜测是尝试配置密钥 spring.cloud.stream.bindings.input.configuration.sasl.jaas.config 但该配置似乎不存在,是吗?

这是我最好的猜测,但它不正确,因为它不起作用:

spring:
  ...
  cloud:
    stream:
      kafka:
        binder:
          brokers: ...
          defaultBrokerPort: 9093
          auto-create-topics: true
          configuration:
            security.protocol: SASL_SSL
            sasl:
              mechanism: PLAIN
        bindings:
          eeoi-sink:
            consumer:
              enableDlq: false
              dlqName: input_dlq
              ackEachRecord: true
              autoCommitOffset: false
      bindings:
        eeoi-sink:
          destination: input
          contentType: application/json
          group: $Default
          consumer:
            max-attempts: 1
          configuration:
            sasl:
              jaas.config: org.apache.kafka.common.security.plain.PlainLoginModule required username="$ConnectionString" password="...";
        acknowledgement-source:
          destination: output
          contentType: application/json
          group: $Default
          configuration:
            sasl:
              jaas.config: org.apache.kafka.common.security.plain.PlainLoginModule required username="$ConnectionString" password="...";

spring.cloud.stream.bindings.input.configuration.sasl.jaas.config 将不起作用。正确的 属性 键是 spring.cloud.stream.kafka.bindings.input.consumer.configuration.sasl.jaas.config.

如果你想使用单独的 jaas 配置,你需要使用 multi-binder 设置。请参阅此应用程序以获取一些想法:https://github.com/spring-cloud/spring-cloud-stream-samples/blob/master/multi-binder-samples/kafka-multi-binder-jaas/src/main/resources/application.yml

在此示例中,它提供了 jaas config for the binder,您只需将其替换为 binder.configuration.sasl.jaas.config

将相同的 Kafka 集群用作两个活页夹设置的代理,但 jaas 配置不同。

但是,我认为您 运行 遇到的问题是不同的。您的 jaas 配置最终委托给 java 安全配置,它为每个 JVM 保留 jaas 配置的静态副本。因此,在 JVM 中静态设置后提供的任何 jaas 配置都将被忽略。

有关相关问题的更多详细信息,请参阅:https://github.com/spring-cloud/spring-cloud-stream-binder-kafka/issues/874

这个问题提供了一些解决这个问题的方法。一种是使两个主题的连接字符串、密码等相同,这样,使用相同的 jaas 配置值。这可能不是一个理想的解决方案,并且首先违背了不同凭证的目的。上述示例之所以有效,是因为我们在两个活页夹中使用了相同的 username/password 组合。

另一种选择是将应用程序一分为二。这样,每个主题的 jaas 配置驻留在单独的应用程序中。