0

我正在使用 Spring 云流和 Kafka 活页夹来使用 SASL 连接到 Kafka 集群。SASL 配置如下所示:

spring.cloud.stream.kafka.binder.configuration.sasl.mechanism=SCRAM-SHA-512
spring.cloud.stream.kafka.binder.configuration.sasl.jaas.config= .... required username="..." password="..."
spring.cloud.stream.kafka.binder.configuration.security.protocol=SASL_SSL

我想以编程方式/在运行时更新用户名和密码,如何使用 Spring Kafka binder 在 Spring Cloud Stream 中执行此操作?

旁注:使用BinderFactory我可以获得对KafkaMessageChannelBinderwhich has的引用KafkaBinderConfigurationProperties,在其configuration哈希图中我可以看到这些配置,但我想知道如何在运行时更新配置,以便这些更改也反映在连接中?

@Autowired
BinderFactory binderFactory

....

public void foo()
{
    KafkaMessageChannelBinder k = (KafkaMessageChannelBinder)binderFactory.getBinder(null, MessageChannel.class);
    // Using debugger I inspected k.configurationProperties.configuration which has the SASL properties I need to update
}
4

2 回答 2

0

可以使用配置提供 jaas 用户名和密码,这也意味着可以在运行时使用相同的属性覆盖它们。

这是一个例子:https ://github.com/spring-cloud/spring-cloud-stream-samples/blob/master/multi-binder-samples/kafka-multi-binder-jaas/src/main/resources/application .yml#L26

在运行时,您可以覆盖在application.properties. 例如,如果您正在使用 运行应用程序java -jar,则可以简单地将属性与它一起传递:spring.cloud.stream.kafka.binder.jaas.options.username. 然后这个新值将在应用程序运行期间生效。

于 2021-03-29T15:50:42.933 回答
0

我昨天遇到了这个问题,花了大约 3-4 个小时来弄清楚如何使用 Spring Kafka binder 以编程方式更新 Spring Cloud Stream 中的用户名和密码,因为不能/不应该在 Git 中存储密码。(Spring Boot 版本 2.5 .2)覆盖bean KafkaBinderConfigurationProperties 的作品。

@Bean
@Primary
public KafkaBinderConfigurationProperties kafkaBinderConfigurationProperties(KafkaBinderConfigurationProperties properties) {
    String saslJaasConfigString = "org.apache.kafka.common.security.scram.ScramLoginModule required username=${USERNAME_FROM_EXTERNAL_SYSTEM_LIKE_VAULT} password=${PASSWORD_FROM_EXTERNAL_SYSTEM_LIKE_VAULT}"
    Map<String, String> configMap = properties.getConfiguration();
    configMap.put(SaslConfigs.SASL_JAAS_CONFIG, saslJaasConfigString);
    return properties;
}
于 2021-08-04T14:45:21.423 回答