Spring boot jar 未连接到 Kafka 代理(通过系统变量 java.security.auth.logi



我有一个Spring boot/spring-kafka应用程序,当作为战争文件部署到外部tomcat服务器时,它可以正确使用消息,我将java.security.auth.login.config环境变量设置为client_jaas.conf文件,该文件的用户名和密码如下。现在我正在尝试将相同的应用程序部署到本地 Docker 容器作为使用内部 tomcat 服务器的 jar,看起来它没有连接到 Kafka 代理,据我所知,它找不到 client_jaas.conf 文件。有没有办法在 application.properties 文件中配置 client_jaas.conf,或者有办法提及用户名、密码等,以便我可以对 Kafka 代理进行身份验证。

client_jaas.conf:

KafkaClient {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="usse_name"
password="pwd123";
};

在 docker 上部署 jar 时,甚至在从命令提示符运行 jar 时,我在下面收到此异常:

Caused by: org.apache.kafka.common.KafkaException: Failed to construct kafka consumer
at org.apache.kafka.clients.consumer.KafkaConsumer.<init>(KafkaConsumer.java:827)
at org.apache.kafka.clients.consumer.KafkaConsumer.<init>(KafkaConsumer.java:629)
at org.springframework.kafka.core.DefaultKafkaConsumerFactory.createKafkaConsumer(DefaultKafkaConsumerFactory.java:207)
at org.springframework.kafka.core.DefaultKafkaConsumerFactory.createConsumerWithAdjustedProperties(DefaultKafkaConsumerFactory.java:193)
at org.springframework.kafka.core.DefaultKafkaConsumerFactory.createKafkaConsumer(DefaultKafkaConsumerFactory.java:167)
at org.springframework.kafka.core.DefaultKafkaConsumerFactory.createConsumer(DefaultKafkaConsumerFactory.java:141)
at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.<init>(KafkaMessageListenerContainer.java:607)
at org.springframework.kafka.listener.KafkaMessageListenerContainer.doStart(KafkaMessageListenerContainer.java:329)
at org.springframework.kafka.listener.AbstractMessageListenerContainer.start(AbstractMessageListenerContainer.java:340)
at org.springframework.kafka.listener.ConcurrentMessageListenerContainer.doStart(ConcurrentMessageListenerContainer.java:176)
at org.springframework.kafka.listener.AbstractMessageListenerContainer.start(AbstractMessageListenerContainer.java:340)
at org.springframework.kafka.config.KafkaListenerEndpointRegistry.startIfNecessary(KafkaListenerEndpointRegistry.java:312)
at org.springframework.kafka.config.KafkaListenerEndpointRegistry.start(KafkaListenerEndpointRegistry.java:257)
at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:182)
... 22 common frames omitted
Caused by: org.apache.kafka.common.KafkaException: java.lang.IllegalArgumentException: No serviceName defined in either JAAS or Kafka config
at org.apache.kafka.common.network.SaslChannelBuilder.configure(SaslChannelBuilder.java:160)
at org.apache.kafka.common.network.ChannelBuilders.create(ChannelBuilders.java:146)
at org.apache.kafka.common.network.ChannelBuilders.clientChannelBuilder(ChannelBuilders.java:67)
at org.apache.kafka.clients.ClientUtils.createChannelBuilder(ClientUtils.java:99)
at org.apache.kafka.clients.consumer.KafkaConsumer.<init>(KafkaConsumer.java:741)
... 35 common frames omitted
Caused by: java.lang.IllegalArgumentException: No serviceName defined in either JAAS or Kafka config
at org.apache.kafka.common.security.kerberos.KerberosLogin.getServiceName(KerberosLogin.java:301)
at org.apache.kafka.common.security.kerberos.KerberosLogin.configure(KerberosLogin.java:92)
at org.apache.kafka.common.security.authenticator.LoginManager.<init>(LoginManager.java:60)
at org.apache.kafka.common.security.authenticator.LoginManager.acquireLoginManager(LoginManager.java:111)
at org.apache.kafka.common.network.SaslChannelBuilder.configure(SaslChannelBuilder.java:149)

我不确定我是否遗漏了某些内容,或者是否有一种方法可以将我的 client_jaas.conf 作为独立文件或将其放在应用程序属性文件中。 我正在使用非安全端口连接到 Kafka 代理

请帮忙。

请参阅文档。您可以使用KafkaJaasLoginModuleInitializer@Bean配置 JAAS

我遇到了完全相同的问题..在我的本地(在IDE中(它只是没有找到*.conf文件在预期的路径上可见。

选项 1:提供 KafkaJaasLoginModuleInitializer bean,正如 Gary 所说。

选项 2:弄乱系统属性

@Configuration
public class KerberosConfig {
@Value("${java.security.krb5.conf}")
private String krb5Conf;  // path to your krb5.conf
@Value("${java.security.auth.login.config}")
private String authConfig;  // path to you jaas-client-$profile.conf
/**
* This implementation configures the run time environment with the relevant
* Kerberos security properties.
*/
@PostConstruct
public void setProperty() {
System.setProperty("java.security.krb5.conf", krb5Conf);
System.setProperty("java.security.auth.login.config", authConfig);
}
}

最新更新