当前位置: 首页 > 知识库问答 >
问题:

Spring启动Kafka:如何配置两个 jaas 配置文件

邬良才
2023-03-14

我有一个spring boot kafka客户端应用程序,其中有两个消费者在kafka中收听不同的主题和不同的消费者群。

为了实现,我需要下面有两个JAAS会议(使用不同的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";
    };

由于下面的connect tFactory在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);
    }

共有1个答案

吴城
2023-03-14

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

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

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

 类似资料:
  • 我有Spring启动应用程序,它是接收静态数据,基于一些业务逻辑,我需要将数据转移到两个不同的kafka集群,它们有自己的kerberos密钥提及的jaas文件。 我已经编写了两个不同的生产者实例,在它们的不同对象实例中具有以下属性。 第二制片人 当我将其作为两个服务启动并仅启用生产者实例时,它可以工作,但当我在单个jar中启用两个实例时,只有一个生产者可以工作,其他生产者会遇到身份验证问题。 我

  • 我有一个用maven作为构建工具的应用程序。 我正在使用maven概要文件从不同的概要文件设置不同的属性。 假设我运行带有out的maven,并指定我希望spring的任何其他概要文件,将和作为活动概要文件。

  • 使用spring-boot-2.1.3、spring-kafka-2.2.4,我希望有两个流配置(例如,拥有不同的application.id,或者连接到不同的集群,等等)。因此,我几乎根据文档定义了第一个流配置,然后添加了第二个流配置,使用了不同的名称,以及第二个StreamsBuilderFactoryBean(也使用了不同的名称): 然而,当我尝试运行该应用程序时,我得到: 在org.spr

  • 我试图连接到Kafka使用汇流。Kafka包。但是,我需要使用jaas作为身份验证方法。我找不到使用融合的方法。Kafka为。NET. 编辑: 我收到以下数据连接: 我试图建立这样的联系: 你们知道我怎么设置收到的Jaas吗?

  • 我正在尝试对我的spring boot应用程序运行selenium测试。我想用我的应用程序的属性启动应用程序。yml和应用测试。yml定义。然而,默认情况下,这不会发生。 我试着按照Dave Syer的建议去做,并实现了一个Application ationContext初始器,它使用YamlProperty tySourceLoader读取application.yml和application-