【问题标题】:Spring-boot kafka: How to configure two jaas conf filesSpring-boot kafka:如何配置两个 jaas conf 文件
【发布时间】: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


    【解决方案1】:

    这是不可能的,至少在 java 8 中是不可能的。JAAS 类在内部使用静态结构来维护 kerberos 配置。

    您必须在每次使用令牌之前初始化/刷新 krb 配置。

    另一种解决方法是对两个 SPN 使用相同的 keytab 文件。 Keytab 可以包含多个 SPN 条目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-27
      • 2021-11-13
      • 2019-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      相关资源
      最近更新 更多