详细介绍如何权限 RabbitMQ 的原理和一些应用示例
权限控制原理
两级控权
RabbitMQ 授权模型分两级:
第一级控权单位是 virtual host
,
第二级控权单位是 resource
(包含exchange
和queue
),两个相同名称的 resource
如果分属不同的 virtual host
,则算是不同的 resource
。
当用户访问 RabbitMQ 时,首先触发第一级控权
,判断用户是否有访问该 virtual host
的权限;
若可访问,则进行第二级控权
,判断用户是否具有操作所请求 resource
的权限。
操作定义
RabbitMQ 定义的操作有三种:configure
主要是创建、删除 exchange
和 queue
操作;write
主要对应绑定和推送消息操作;read
主要对应读取消息操作。
具体对应如下表:
AMQP 0-9-1 Operation | configure | write | read | |
---|---|---|---|---|
exchange.declare | (passive=false) | exchange | ||
exchange.declare | (passive=true) | |||
exchange.declare | (with AE) | exchange | exchange (AE) | exchange |
exchange.delete | exchange | |||
queue.declare | (passive=false) | queue | ||
queue.declare | (passive=true) | |||
queue.declare | (with DLX) | queue | exchange (DLX) | queue |
queue.delete | queue | |||
exchange.bind | exchange (destination) | exchange (source) | ||
exchange.unbind | exchange (destination) | exchange (source) | ||
queue.bind | queue | exchange | ||
queue.unbind | queue | exchange | ||
basic.publish | exchange | |||
basic.get | queue | |||
basic.consume | queue | |||
queue.purge | queue |
授权元素
当管理员对一个用户进行授权时,要配置两个元素:
- 允许什么操作,即
configure
、write
、read
三种 operation ; - 操作什么
resource
,即用户是否拥有某资源的权限,通过对该资源的名称与授权时配置的正则
进行匹配来判断,如果能匹配上则允许对应的操作
如何设置
命令行
这里只讲添加,如何删除,请参考其它文档或者通过rabbitmqctl help
查看帮助
添加 virtual host
命令格式
1 | rabbitmqctl [--node <node>] [--longnames] [--quiet] add_vhost <vhost> [--description <description> --tags "<tag1>,<tag2>,<...>"] |
示例:添加一个名字叫 segon.cn
的 virtual host
1 | rabbitmqctl add_vhost segon.cn |
添加用户
1 | rabbitmqctl [--node <node>] [--longnames] [--quiet] add_user <username> <password> |
示例:添加一个名字叫 segon
密码为 123456
的用户
1 | rabbitmqctl add_user segon 123456 |
设置权限
1 | rabbitmqctl [--node <node>] [--longnames] [--quiet] set_permissions [--vhost <vhost>] <username> <conf> <write> <read> |
示例:允许用户 segon
访问 segon.cn
这个 virtual host
1 | rabbitmqctl set_permissions -p segon.cn segon ".*" ".*" ".*" |
web 管理页面
添加 virtual host
添加用户
设置权限
进入用户详情界面
添加权限
示例
web 管理页面参考
下图是segon
用户的详情,在Current permissions
字段可以看到对 segon.cn
这个 virtual host
具有所有的操作权限,因为 .*
匹配所有字符串
不允许配置 Exchange
和 Queue
1 | rabbitmqctl set_permissions -p segon.cn segon "^$" ".*" ".*" |
注意 conf
字段设置的是 ^$
,这个是匹配一个空行,所以不会匹配到任何 exchange
和 queue
,所以没法对 segon.cn
下面的任何 exchange
和 queue
进行创建、删除操作
只允许用户消费以”star”开头的队列
1 | rabbitmqctl set_permissions -p segon.cn segon "^$" ".*" "^star.*" |
注意 read
字段设置的是 ^star.*
,如果某个 queue 不是以 “star” 开头,那么用户 segon
则不能获取、消费队列中的消息
参考文档
https://www.rabbitmq.com/vhosts.html
https://www.rabbitmq.com/access-control.html
https://www.rabbitmq.com/rabbitmqctl.8.html#Access_control