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