捋明白 RabbitMQ 中的權限系統(tǒng),再也不擔心消息發(fā)送失敗了!
不管我們是通過網頁還是通過命令行工具創(chuàng)建用戶對象,剛創(chuàng)建好的用戶對象都是沒法直接使用的,需要我們首先把這個用戶置于某一個 vhost 之下,然后再賦予其權限,有了權限,這個用戶才可以正常使用。
那么今天我們就來了解一下 RabbitMQ 中的權限系統(tǒng),看下這個權限系統(tǒng)是什么樣子的。
1. RabbitMQ 權限系統(tǒng)介紹
RabbitMQ 是從 1.6 這個版本開始實現(xiàn)了一套 ACL 風格的權限系統(tǒng),可能有小伙伴還不知道什么是 ACL 風格的權限系統(tǒng),可以看看松哥之前發(fā)的這兩篇文章:
Spring Security 中如何細化權限粒度?
一個案例演示 Spring Security 中粒度超細的權限控制!
在這套 ACL 風格的權限管理系統(tǒng)中,允許非常多細粒度的權限控制,可以為不同用戶分別設置讀、寫以及配置等權限。
這里涉及到三種不同的權限:
- 讀:和消息消費有關的所有操作,包括清除整個隊列的消息。
- 寫:發(fā)布消息。
- 配置:消息隊列、交換機等的創(chuàng)建和刪除。
這是 RabbitMQ 權限系統(tǒng)的一個簡單介紹。
2. 操作和權限的對應關系
接下來,下圖展示了操作和權限的對應關系:
公眾號后臺回復 rabbitmq_permission 可以獲取這張圖的 Excel 表格。
執(zhí)行什么命令,需要什么權限,這張圖描述的一清二楚了。
3. 權限操作命令
RabbitMQ 中權限操作命令格式如下:
- rabbitmqctl set_permissions [-p vhosts] {user} {conf} {write} {read}
這里有幾個參數(shù):
- [-p vhost]:授予用戶訪問權限的 vhost 名稱,如果不寫默認為 /。
- user:用戶名。
- conf:用戶在哪些資源上擁有可配置權限(支持正則表達式)。
- write:用戶在哪些資源上擁有寫權限(支持正則表達式)。
- read:用戶在哪些資源上擁有讀權限(支持正則表達式)。
至于可配置權限能干嘛,寫權限能干嘛,讀權限能干嘛,大家可以參考第二小節(jié),這里不再贅述。
松哥來舉一個簡單的例子。
假設我們有一個名為 zhangsan 的用戶,我們希望該用戶在 myvh 虛擬主機下具備所有權限,那么我們的操作命令如下:
- rabbitmqctl set_permissions -p myvh zhangsan ".*" ".*" ".*"
執(zhí)行結果如下:
接下來執(zhí)行如下命令可以驗證授權是否成功:
- rabbitmqctl -p myvh list_permissions
可以看到,張三的權限已經賦值到位。
在上面的授權命令中,我們用的都是 ".*",松哥再額外說下這個通配符:
".*":這個表示匹配所有的交換機和隊列。
"javaboy-.*":這個表示匹配名字以 javaboy- 開頭的交換機和隊列。
"":這個表示不匹配任何隊列與交換機(如果想撤銷用戶的權限可以使用這個)。
我們可以使用如下命令來移除某一個用戶在某一個 vhost 上的權限,例如移除 zhangsan 在 myvh 上的所有權限,如下:
- rabbitmqctl clear_permissions -p myvh zhangsan
執(zhí)行完成后,我們可以通過 rabbitmqctl -p myvh list_permissions 命令來查看執(zhí)行結果是否生效,最終執(zhí)行效果如下:
如果一個用戶在多個 vhost 上都有對應的權限,按照上面的 rabbitmqctl -p myvh list_permissions 命令只能查看一個 vhost 上的權限,此時我們可以通過如下命令來查看 lisi 在所有 vhost 上的權限:
- rabbitmqctl list_user_permissions lisi
4. Web 管理頁面操作
當然,如果你不想敲命令,也可以通過 Web 管理端去操作權限。
在 Admin 選項卡,點擊用戶名稱,就可以給用戶設置權限了,如下:
可以設置權限,也可以清除權限。
當然,在網頁上還有一個 Topic Permissions,這是 RabbitMQ3.7 開始的一個新功能,可以針對某一個 topic exchange 設置權限,主要針對 STOMP 或者 MQTT 協(xié)議,我們日常 Java 開發(fā)用上這個配置的機會很少。如果用戶不設置的話,相應的 topic exchange 也總是有權限的。
5. 小結
好啦,這就是關于 RabbitMQ 權限管理的一點點小知識~感興趣的小伙伴可以去試試啦~
本文轉載自微信公眾號「江南一點雨」,可以通過以下二維碼關注。轉載本文請聯(lián)系江南一點雨公眾號。