TLDR:相关信息可以在这里找到:https://www.rabbitmq.com/access-control.html https://www.rabbitmq.com/access-control.html。然而,由于rabbitmq文档非常冗长,下面我将描述似乎是锁定资源访问的唯一解决方案。
Summary
虚拟主机
正如迈克尔·狄龙(Michael Dillon)提到的,你应该从让一切在内部发生开始vhosts
(虚拟主机 https://www.rabbitmq.com/vhosts.html)并阻止泛型vhost
完全。通用虚拟主机简称为/
并且默认是唯一的vhost
当你启动rabbitmq服务器时。
给定的资源(即队列或交换器)必须存在于一个资源中vhost
和一个vhost
仅有的。一个rabbitmq连接还必须专门连接到一个vhost
(这可以通过附加来指定vhost
名称到rabbitmq URL 例如amqp://username:password@myserver:5672/vhost
)。因此,rabbitmq 连接只能访问位于以下位置的队列和交换器:vhost
它已连接到。
只需创建尽可能多的vhosts
因为您的应用程序中有逻辑分组。请记住,资源合二为一vhost
不知道并且无法与另一个资源进行通信vhost
。创建一个vhost
通过做:
rabbitmqctl add_vhost vhost-name
Users
下一步是创建用户并删除默认用户guest
用户。每个用户都应该有自己的用户名和密码,并且只能由他们使用。不用说,只有实际管理员才应该拥有管理员权限。这使他们能够管理其他用户,vhosts
以及他们的权限。通过执行以下操作创建用户:
rabbitmqctl add_user "username"
用户可以使用他们的凭据创建rabbitmq连接,从而连接到vhost
。但是,只有在以下情况下才批准连接:vhost
用户有权访问。只有管理员可以授予和修改用户的访问权限vhost
。一个用户可以被授予访问多个vhosts
并使用他们的凭据连接到多个vhosts
同时(但不不同)vhosts
在同一连接内)。
用户权限 https://www.rabbitmq.com/access-control.html#authorisation
然而,用户访问vhost
并不是简单的二进制。
RabbitMQ 的区别配置, write and read操作于
一种资源。这配置操作会创建或破坏资源,或者
改变他们的行为。这write操作将消息注入到
资源。还有read操作从资源中检索消息。
文档的链接部分中有一个很好的表格,它表示什么命令算作什么类型的操作,例如queue.bind
is a write
操作而queue.get
is a read
手术。然而复杂性并不止于此,实际上是根据自定义向每个操作类型授予权限。正则表达式 https://stackoverflow.com/questions/4736/learning-regular-expressions(正则表达式)由管理员选择。
例如正则表达式'.*' '.*' '.*'
允许用户分别配置、写入和读取该资源中的任何资源vhost
。这将被授予like so https://www.rabbitmq.com/rabbitmqctl.8.html#set_permissions:
rabbitmqctl set_permissions -p "vhost-name" "username" ".*" ".*" ".*"
而正则表达式'^$' '^(hello).*$' '^(hello|world).*$'
不会授予用户任何配置权限,但允许他们写入名称以hello
并从名称以以下任一开头的任何资源中读取hello
or world
.
要点
Use vhosts
自由地将资源分组在一起并对这些资源作为一个整体设置权限。
资源的命名是很重要因为这是在给定范围内配置对该资源的访问的唯一方法vhost
.
对于OP的问题,每个用户都应该被授予只能根据队列的唯一名称读取和写入自己的队列的权限。这不一定需要跨越多个vhosts
但如果有意义的话就可以。