首页 > 解决方案 > 将 Spring 引导安全上下文传播到使用 @KafkaListener 注释的 bean 中

问题描述

我有一个用@KafkaListener这个 bean 注释的 bean,我打算通过SecurityContextHolder.

但是,SecurityContextHolder.getContext().getAuthentication()给我一个null对象可能是因为它在不同的thread.

在这种情况下,有没有办法将SecurityContextfrom传播ThreadLocal到另一个线程?可以在我的Spring Boot配置中轻松完成吗?

下面是示例代码:

@Component
@Slf4j
public class MessageConsumer {

private final MessageService messageService;

@Autowired
public MessageConsumer(final MessageService service) {
    messageService = service;
}

@KafkaListener(topics = "myTopic")
public void receive(final List<Message> message) {
    messageService.consumerAnStoreMessage(message, SecurityContextHolder.getContext().getAuthentication());
 }
}

标签: springspring-bootspring-securityspring-kafka

解决方案


SecurityContext 的身份验证表示,例如,调用 Web 服务的用户、网站的页面......等等......

当您收听 kafka 消息时,应该使用哪个用户的上下文?我不认为你正在尝试做的事情真的有意义。


推荐阅读