java - 卡夫卡 "Login module not specified in JAAS config"

标签 java apache-kafka jaas sasl

我在使用控制台脚本与受 sasl 保护的 Kafka 通信时遇到问题。 Kafka 使用 sasl 进行保护,监听器为 SASL_PLAINTEXT,机制为 PLAIN

我做了什么: 我尝试使用其中一个 kafka 脚本列出一些数据:

bin/kafka-consumer-groups.sh --bootstrap-server (address) --list

但是我得到了

WARN Bootstrap broker (address) disconnected (org.apache.kafka.clients.NetworkClient)

并且命令失败,这是可以理解的,因为它使用 sasl 进行保护。

所以我尝试了如何将客户端用户名/密码添加到该命令。 首先,我尝试运行 kafka-console-consumer 脚本,我使用 --command-config 添加必要的文件。我很快发现我不能直接添加 jaas 文件,我需要使用 .properties 文件,所以我这样做了。

我的属性文件(请记住,括号表示“审查”数据,我不能将所有真实数据放在这里):

bootstrap.servers=(address)
zookeeper.connect=127.0.0.1:2181
zookeeper.connection.timeout.ms=6000
sasl.jaas.config=(path)/consumer_jaas.conf
security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN
group.id=(group)

我的 jaas 文件:

KafkaClient {
    org.apache.kafka.common.security.plain.PlainLoginModule required
    username=(username)
    password=(password);
};

jaas 文件适用于我的标准 java 应用程序。

但是,当我尝试运行 kafka-consumer-groups 脚本或 kafka-console-consumer 时,出现此错误:

Exception in thread "main" org.apache.kafka.common.KafkaException: java.lang.IllegalArgumentException: Login module not specified in JAAS config
at org.apache.kafka.common.network.SaslChannelBuilder.configure(SaslChannelBuilder.java:94)
at org.apache.kafka.common.network.ChannelBuilders.create(ChannelBuilders.java:93)
at org.apache.kafka.common.network.ChannelBuilders.clientChannelBuilder(ChannelBuilders.java:51)
at org.apache.kafka.clients.ClientUtils.createChannelBuilder(ClientUtils.java:84)
at kafka.admin.AdminClient$.create(AdminClient.scala:229)
at kafka.admin.AdminClient$.create(AdminClient.scala:223)
at kafka.admin.AdminClient$.create(AdminClient.scala:221)
at kafka.admin.ConsumerGroupCommand$KafkaConsumerGroupService.createAdminClient(ConsumerGroupCommand.scala:454)
at kafka.admin.ConsumerGroupCommand$KafkaConsumerGroupService.<init>(ConsumerGroupCommand.scala:389)
at kafka.admin.ConsumerGroupCommand$.main(ConsumerGroupCommand.scala:65)
at kafka.admin.ConsumerGroupCommand.main(ConsumerGroupCommand.scala)
Caused by: java.lang.IllegalArgumentException: Login module not specified in JAAS config
at org.apache.kafka.common.security.JaasConfig.<init>(JaasConfig.java:68)
at org.apache.kafka.common.security.JaasUtils.jaasConfig(JaasUtils.java:59)
at org.apache.kafka.common.network.SaslChannelBuilder.configure(SaslChannelBuilder.java:85)

这个 jaas 文件是我在与 kafka 通信的 java 应用程序中使用的文件的直接副本,它可以工作,但是在这里,使用控制台工具,它就是行不通。我尝试寻找解决方案,但找不到任何有用的东西。

谁能帮我解决这个问题?

最佳答案

有两种方法可以为 Kafka 客户端提供 JAAS 配置。

  • 通过客户端属性:sasl.jaas.config。在那种情况下,您将它设置为实际的 JAAS 配置条目。例如,您的配置文件变为:

    bootstrap.servers=(address)
    zookeeper.connect=127.0.0.1:2181
    zookeeper.connection.timeout.ms=6000
    sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="(username)" password="(password)";
    security.protocol=SASL_PLAINTEXT
    sasl.mechanism=PLAIN
    group.id=(group)
    

    如您所知,您可以使用 --command-config 将属性文件传递给 kafka-consumer-groups.sh

  • 通过 Java 属性:java.security.auth.login.config。在这种情况下,您将其设置为 JAAS 文件的路径。此外,如果您在 KAFKA_OPTS 中设置它,kafka-consumer-groups.sh 将自动获取它。

    export KAFKA_OPTS="-Djava.security.auth.login.config=(path)/consumer_jaas.conf"
    

关于java - 卡夫卡 "Login module not specified in JAAS config",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45756543/

相关文章:

java - 试图弄清楚经典的背包重现

java - ThreadPoolExecutor - 核心和最大池大小

java - 模型类和外部库最佳实践

java - 无法执行目标 org.codehaus.mojo :exec-maven-plugin:1. 2.1 - kafka Storm 集成

java - Kafka 消费者 - 分配和查找

c# - 软件开发人员不将授权外部化是否有原因?

java - 如何设置自定义主体类

java - 方法句柄查找工具

security - 使用容器管理的身份验证时如何在 JSF 中获取登录用户名

Windows 10 上的 java.lang.NoClassDefFoundError : Could not initialize class org. Rocksdb.Options