天天看點

rabbitmq 插件之rabbitmq-auth-backend-http

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-auth-backend-cache

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鑒權請求