Spring Boot 基于 SCRAM 认证集成 Kafka 的详解

news/2025/3/16 23:00:25/文章来源:https://www.cnblogs.com/zlt2000/p/18342834

一、说明

在现代微服务架构中,Kafka 作为消息中间件被广泛使用,而安全性则是其中的一个关键因素。在本篇文章中,我们将探讨如何在 Spring Boot 应用中集成 Kafka 并使用 SCRAM 认证机制进行安全连接;并实现动态创建账号、ACL 权限、Topic,以及生产者和消费者等操作。

需要准备一个配置了 SCRAM 认证的 Kafka 环境,可参考《基于 SASL/SCRAM 让 Kafka 实现动态授权认证》 进行部署。

 

二、添加依赖

Spring Boot 项目的 pom.xml 中添加 spring-kafka 依赖

<dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId>
</dependency>

 

三、配置 Kafka

application.yml 中配置 Kafka 的相关属性,包括服务器地址、认证信息等。

spring:  kafka:  bootstrap-servers: localhost:9092  properties:  security.protocol: SASL_PLAINTEXT  sasl.mechanism: SCRAM-SHA-256 sasl.jaas.config: org.apache.kafka.common.security.scram.ScramLoginModule required username="your_username" password="your_password";consumer:group-id: test-consumer-groupauto-offset-reset: earliestproperties:sasl.jaas.config: org.apache.kafka.common.security.scram.ScramLoginModule required username="test" password="test";producer:key-serializer: org.apache.kafka.common.serialization.StringSerializervalue-serializer: org.apache.kafka.common.serialization.StringSerializer
  • bootstrap-servers Kafka 的集群地址
  • security.protocol 通讯协议指定启用SASL
  • sasl.mechanism 指定 SASL 使用的具体身份验证机制
  • sasl.jaas.config 指定认证模块的处理类以及 用户名密码
  • auto-offset-reset 指定偏移量的逻辑,earliest 代表新加入的消费者都是从头开始消费

 

四、动态管理资源

4.1. 创建 KafkaAdminClient

KafkaAdminClient 用于管理 Kafka 资源(用户、ACL、主题等)。以下是示例代码:

@Configuration
public class KafkaConfig {@Beanpublic KafkaAdminClient kafkaAdminClient(KafkaAdmin kafkaAdmin) {return (KafkaAdminClient) KafkaAdminClient.create(kafkaAdmin.getConfigurationProperties());}
}

 

4.2. 动态创建用户和设置权限

使用 Kafka AdminClient API 实现动态创建用户和设置 ACL 权限:

/*** 创建用户*/
public void createUser(String userName, String password) throws ExecutionException, InterruptedException {// 构造Scram认证机制信息ScramCredentialInfo info = new ScramCredentialInfo(ScramMechanism.SCRAM_SHA_256, 8192);//用户信息UserScramCredentialAlteration userScramCredentialAdd = new UserScramCredentialUpsertion(userName, info, password);AlterUserScramCredentialsResult result = kafkaAdminClient.alterUserScramCredentials(List.of(userScramCredentialAdd));result.all().get();
}/*** 配置用户只读权限*/
public void createAcl(String account, String topicName, String consumerGroup) {AclBinding aclBindingTopic = genAclBinding(account, ResourceType.TOPIC, topicName, AclOperation.READ);AclBinding aclBindingGroup = genAclBinding(account, ResourceType.GROUP, consumerGroup, AclOperation.READ);kafkaAdminClient.createAcls(List.of(aclBindingTopic, aclBindingGroup));
}

 

4.3. 动态创建主题

public void createTopic(String topicName, int partitions, short replicationFactor) throws ExecutionException, InterruptedException {NewTopic newTopic = new NewTopic(topicName, partitions, replicationFactor);CreateTopicsResult result = kafkaAdminClient.createTopics(List.of(newTopic));result.all().get();
}

 

五、生产者和消费者配置

5.1. 生产者配置

配置 Kafka 生产者,用于发送消息:

@Service
public class KafkaProducer {private final KafkaTemplate<String, String> kafkaTemplate;public KafkaProducer(KafkaTemplate<String, String> kafkaTemplate) {this.kafkaTemplate = kafkaTemplate;}public void sendMessage(String message) {kafkaTemplate.send("test", message);}
}

 

5.2. 消费者配置

使用 @KafkaListener 注解实现消费消息方法:

@Service
public class KafkaConsumer {@KafkaListener(topics = "test", groupId = "test-consumer-group")public void consume(String message) {System.out.println("Received message: " + message);}
}

 

六、总结

通过以上步骤,我们成功地在 Spring Boot 应用中集成了 Kafka,并使用 SCRAM 认证机制进行安全连接;确保在生产环境中妥善管理用户凭证,并根据需要调整 Kafka 的安全配置。

完整的样例代码下载:
https://gitee.com/zlt2000/kafka-scram-demo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/778056.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win系统下 由于管理员设置的策略,该磁盘处于脱机状态解决办法

1.运行:cmd 2.输入:DISKPART.exe 3.DISKPART> san 4.DISKPART> san policy=onlineall 5.DISKPART>list disk 6.DISKPART> select disk 1 7.DISKPART>attributes disk clear readonly 8.DISKPART>online disk

Ros2 Moveit2 之 在Riz2中可视化

本教程将向您介绍一个工具,通过在 RViz 中呈现可视化效果,该工具可以帮助您更轻松地了解 MoveIt 应用程序正在做什么。 先决条件 如果你还没有完成,请确保你已经完成了你的第一个项目hello_moveit中的步骤。这个项目假设你从上一个教程结束的地方开始。 步骤 1 添加依赖 mov…

后端开发学习敏捷需求--产品价值的定位

产品价值的定位 为什么要写这一系列文章2023年网上报名学习了,敏捷软件需求的培训课程 ,一直都没有进行回顾,回顾学习,总结 业务分析的能力偏弱,学习和了解关于业务需求相关的方法和理论 每一年都有一段时间的清醒期,不做点啥事情,容易迷茫和精神内耗 很多视角都是通过自…

模型剪枝大揭秘-以LeNet为例

本文来自博客园,作者:海_纳百川,转载请注明原文链接:https://www.cnblogs.com/chentiao/p/18342820,如有侵权联系删除

免费领取云主机,在华为开发者空间玩转YOLOV3

摘要:YOLOv3(You Only Look Once version 3)是一种高效的目标检测算法,旨在实现快速而准确的对象检测。 本文分享自华为云社区《华为云开发者云主机体验【玩转华为云】》,作者: DS小龙哥。 一、前言 云主机是华为云为全球开发者打造的专属开发空间,汇聚了华为优质开发资…

C 语言(二)数组与字符串

C 语言(二)数组与字符串 1. 数组 所谓数组,就是一个集合,里面存放了相同类型的数据元素 特点1:数组中的每个数据元素都是相同的数据类型 特点2:数组是由连续的内存位置组成的1.1 一维数组定义: // 伪代码 数据类型 数组名 【数组长度】; 数据类型 数组名 【数组长度】 =…

内存交换空间--Swap Space

转载请注明出处: 一、概述 内存交换空间(Swap Space)是计算机内存的一种补充,位于硬盘驱动器上。当物理内存(RAM)不足时,系统会将不活跃的页面(或称为内存页)移到交换空间中,以释放物理内存给更需要的进程。这种方式虽然比直接从物理内存中读取数据要慢,但能有效避免…

Markdown新技能解锁!轻松绘制专业时序图,让你的文档秒变高大上

时序图是一种表现交互过程的图示,主要展示各个参与者之间是如何交互的,以及交互的顺序是怎样的。时序图是一种表现交互过程的图示,主要展示各个参与者之间是如何交互的,以及交互的顺序是怎样的。 ‍ 快速入门 听不太懂?没关系,看个例子,下图是小程序登陆过程中,小程序、…

C语言--轮圈机制

数据是以二进制补码形式存储在计算机内存中,而数据类型限制了数据的大小,种类,范围,精度等。 在存储二进制数据时,常常遇到存储的数值超出数据类型范围的情况。而这时的存储原理又是怎样的呢? 根据实践,不难总结出一个规律,计算机存储的数据在一个范围内循环。如下图所…

kubeadm安装k8s

目录1.环境准备2.所有节点安装docker3.所有节点安装kubeadm4.Nginx负载均衡部署5.部署K8S集群6.所有节点部署网络插件flannel 1.环境准备 (1)在所有节点上安装Docker和kubeadm (2)部署Kubernetes Master (3)部署容器网络插件 (4)部署 Kubernetes Node,将节点加入Kuber…

linux 安装 nginx

一、官网下载Nginx 官网地址:http://nginx.org/en/download.html我下载的是最新稳定版二、上传到服务器解压 1、上传到指定的服务器地址 上传的地址自己决定,我上传到 /usr/Nginx。2、解压 使用命令: tar -zxvf “你的Nginx压缩包”,我这里是:tar -zxvf nginx-1.24.0.tar.…

pytorch中中的模型剪枝方法

一,剪枝分类所谓模型剪枝,其实是一种从神经网络中移除"不必要"权重或偏差(weigths/bias)的模型压缩技术。关于什么参数才是“不必要的”,这是一个目前依然在研究的领域。1.1,非结构化剪枝非结构化剪枝(Unstructured Puning)是指修剪参数的单个元素,比如全连…