升级spring-boot-starter-parent后出现Kafka集群授权失败错误
问题背景
原有Spring Boot 2.3.2.RELEASE应用配置Kafka生产者/消费者运行正常,POM配置如下:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.2.RELEASE</version> <relativePath /> </parent> <properties> <spring-framework.version>5.2.20.RELEASE</spring-framework.version> <spring-cloud.version>HOXTON.SR6</spring-cloud.version> </properties> .......
升级到Spring Boot 2.6.14后,POM调整为:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.14</version> <relativePath /> </parent> <properties> <spring-cloud.version>2021.0.5</spring-cloud.version> .... </properties> <dependencies> ....... <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-stream-binder-kafka</artifactId> </dependency> <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> </dependency> <dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-integration-kafka</artifactId> </dependency> ....... </dependencies>
此时生产者抛出集群授权错误,认证信息、证书均未修改,报错如下:
org.springframework.kafka.core.KafkaProducerException: Failed to send; nested exception is org.apache.kafka.common.errors.ClusterAuthorizationException: Cluster authorization failed.
at org.springframework.kafka.core.KafkaTemplate.lambda$buildCallback$6(KafkaTemplate.java:696)
at org.springframework.kafka.core.DefaultKafkaProducerFactory$CloseSafeProducer$1.onCompletion(DefaultKafkaProducerFactory.java:1095)
at org.apache.kafka.clients.producer.KafkaProducer$InterceptorCallback.onCompletion(KafkaProducer.java:1350)
at org.apache.kafka.clients.producer.internals.ProducerBatch.completeFutureAndFireCallbacks(ProducerBatch.java:273)
at org.apache.kafka.clients.producer.internals.ProducerBatch.abort(ProducerBatch.java:161)
at org.apache.kafka.clients.producer.internals.RecordAccumulator.abortBatches(RecordAccumulator.java:773)
at org.apache.kafka.clients.producer.internals.Sender.maybeAbortBatches(Sender.java:498)
at org.apache.kafka.clients.producer.internals.Sender.runOnce(Sender.java:307)
at org.apache.kafka.clients.producer.internals.Sender.run(Sender.java:243)
at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: org.apache.kafka.common.errors.ClusterAuthorizationException: Cluster authorization failed.
排查思路
检查Kafka客户端默认配置变更
升级后Spring Boot 2.6.14对应spring-kafka版本为2.8.x,关联的Apache Kafka客户端版本为3.0.x,该版本安全配置默认行为有调整:- 确认
ssl.endpoint.identification.algorithm配置,新版本默认设为HTTPS,若Kafka集群未配置主机名验证,需显式设为""(空字符串); - 核对
security.protocol是否正确,确保显式指定为SSL/SASL_SSL等集群要求的协议,避免新版本默认值与旧版本不一致。
- 确认
验证证书加载有效性
- 确认证书文件路径(
ssl.truststore.location、ssl.keystore.location等)是否正确,新版本可能对相对路径支持更严格,建议使用绝对路径; - 检查证书文件权限,确保应用进程有读取权限,避免因权限不足导致无法加载证书。
- 确认证书文件路径(
排查Spring Cloud Stream与Spring Kafka的配置冲突
同时引入spring-cloud-stream-binder-kafka和spring-kafka时,需确认两类配置是否统一:- Spring Cloud Stream配置前缀为
spring.cloud.stream.kafka.binder.*,原生Spring Kafka配置前缀为spring.kafka.producer.*,确保安全配置在两处均正确设置; - 避免Spring Cloud Stream的默认配置覆盖原生Kafka生产者的认证参数,可通过显式配置强制指定认证信息。
- Spring Cloud Stream配置前缀为
查看Kafka Broker端日志
Broker端日志会提供更详细的授权失败原因,比如证书过期、用户名错误、生产权限缺失等,以此定位具体问题,而非仅依赖客户端的笼统报错。核对SASL认证的JAAS配置(若适用)
若使用SASL_SSL认证,新版本Kafka客户端对JAAS配置格式要求更严格:- 确认
spring.kafka.producer.properties.sasl.jaas.config配置是否正确,或JAAS文件路径、格式是否符合要求; - 检查SASL机制(如
PLAIN/SCRAM-SHA-256)是否与集群配置一致。
- 确认
最小化配置测试
创建仅依赖spring-kafka的极简Spring Boot应用,配置必要认证信息测试生产功能,排除Spring Cloud Stream、Spring Integration Kafka的干扰,逐步添加依赖定位问题根源。
内容的提问来源于stack exchange,提问作者Saher

