【发布时间】:2021-09-10 12:27:03
【问题描述】:
我有一个 spring boot kafka 客户端应用程序,其中我有两个消费者在 kafka 中听不同的主题和不同的消费者组。
为了实现,我需要在下面有两个 JAAS conf(使用不同的 keytab 文件)
dc-jaas-A.conf
KafkaClient {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
storeKey=true
useTicketCache=false
serviceName="kafka"
keyTab="testA.keytab"
principal="testA@domain.com";
};
dc-jaas-B.conf
KafkaClient {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
storeKey=true
useTicketCache=false
serviceName="kafka"
keyTab="testB.keytab"
principal="testB@domain.com";
};
由于下面的 connectFactory 在 System.setProperty 中设置了 dc-jaas-A.conf 和 dc-jaas-B.conf,因此该值被覆盖,因此我得到 "org.apache.kafka.common。 errors.TopicAuthorizationException" 异常。
@Bean
public ProducerFactory<String, String> producerFactoryForA() {
System.setProperty("java.security.auth.login.config", "C:/Users/Files/dc-jaas-A.conf");
System.setProperty("java.security.krb5.conf","C:/Users/Files/krb5.conf");
Map<String, Object> configs = new HashMap<>();
configs.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
// more configs here
return new DefaultKafkaProducerFactory<>(configs);
}
@Bean
public ProducerFactory<String, String> producerFactoryForB() {
System.setProperty("java.security.auth.login.config", "C:/Users/Files/dc-jaas-B.conf");
System.setProperty("java.security.krb5.conf","C:/Users/Files/krb5.conf");
Map<String, Object> configs = new HashMap<>();
configs.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
// more configs here
return new DefaultKafkaProducerFactory<>(configs);
}
【问题讨论】:
标签: spring-boot apache-kafka kerberos jaas