rabbitmq-auth-backend-http 是rabbitMq的一个鉴权插件,从3.6.X开始可以作为额外添加的插件使用,从3.7.0以后rabbitMq自带使用
本文基于rabitmq 3.8.18
一、整体环境搭建
1、rabbitmq服务器搭建环境:
使用docker
docker pull rabbitmq:3.8.18-management
docker run -d --hostname my-rabbit-manager --name rabbit-manager -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -p 15672:15672 -p 5672:5672 rabbitmq:3.8.18-management
至此服务器搭建完毕
2、测试:
访问localhost:15672
在管理页面新建exchange,queue, routingKey进行绑定(如果需要新建vhost,新用户test,一下使用用户test 和vhost:/test进行)
新建springboot项目添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
appliaction.properties
生产者代码(为方便写在controller中,可以根据需要写单元测试中也可写其他方式):
rabbitTemplate.convertAndSend(exchange,routingKey,info);
可以发现队列中已经有数据了
消费者代码(我放入队列的是字符串,直接读取了):
@Service
@EnableRabbit
public class SimpleMsgConsumer {
@RabbitListener(queues = "${test.queue}", containerFactory = "receiveRabbitListenerContainerFactory")
public void sendRedPacket(String body) {
System.out.println(body);
}
}
至此rabbitmq整体搭建和测试完成
二、插件调用
插件实现鉴权流程说明
在启动插件后,当任何请求到达队列时候,队列会调用http请求到一个web服务器去查询是否该请求有对应的权限,主要分为以下四个权限
1、账号权限:用户名密码是否正确
2、vhost权限:该账号下是否有对应的vhost
3、资源权限:该用户是否有指定vhost下的exchange、queue的读写配置全新啊
4、topic权限:主题授权的概念只对面向主题的协议(如 MQTT 和 STOMP)才真正有意义(amqp如果不特殊配制,只用到了以上三个)
特别说明:如果启用了插件,那么任何访问该rabbitmq的校验都会到这里验证,忽略掉服务器上原来的配置(也就是说即使manager后台没有配置的用户,只要权限验证接口返回可以访问那么就能正常的生产和消费队列数据)
启动rabbitmq-auth-backend-http插件
进入容器
docker exec -it some-rabbit /bin/bash
1、修改配置,当前使用的是linux系统的容器,在/etc/rabbitmq/下有rabbitmq.conf文件
vim /etc/rabbitmq/rabbitmq.conf
新增
auth_backends.1 = http
auth_http.http_method = post
auth_http.user_path = http://host.docker.internal:8080/auth/user
auth_http.vhost_path = http://host.docker.internal:8080/auth/vhost
auth_http.resource_path = http://host.docker.internal:8080/auth/resource
auth_http.topic_path = http://host.docker.internal:8080/auth/topic
说明:因为我用的是docker,测试接口在宿主机上需要使用host.docker.internal通信,具体自行学习docker网络设置相关
2、启动插件
rabbitmq-plugins enable rabbitmq_auth_backend_http
3、重启服务
$ docker container restart a8b2a1410768
注意如果此时没有启动要访问的web服务,那么所有的rabbit请求(包含管理平台的登陆)都是无权限的
4、启动web服务,基于springboot,代码如下(官方示例)
https://gitee.com/leo18945/rabbitmq-auth-backend-http/tree/master/examples
这样你能在web服务中看到mq的请求信息
需要说明的是user和vhost请求是有缓存的,观察下来发现一旦鉴权通过就一直有效(待补充)
关于主题授权的说明
https://www.rabbitmq.com/access-control.html#topic-authorisation
rabbitmq-plugins enable rabbitmq_auth_backend_cache
配置 /etc/rabbitmq/rabbitmq.conf
auth_backends.1 = cache
auth_cache.cached_backend = http
auth_cache.cache_ttl = 5000
这里的5000单位是ms,表示一个请求结束后5s 如果在5s内连续请求将不会发起resource鉴权请求