RabbitMQ用户对预先创建的队列上的pub/sub的权限

zfo*_*fou 6 permissions amqp rabbitmq

我有一个用例,我需要创建一个用户并授予他在现有队列中只有pub/sub的权限,这是一个例子:

  • Vhost"mainvhost"(对所有用户都一样)
  • 在vhost中,我有Q-foo和Q-bar队列
  • 用户"foo"只能发布/发送到Q-foo
  • 用户"bar"只能发布/转到Q-bar

我没有得到设置这样的用户管理策略的方法,我发现的唯一方法是为每个用户创建一个vhost,这样,用户将在其自己的vhost中拥有完全访问权限,但是有一个很大的缺点:我有一个消费者应用程序,订阅所有队列并等待用户输入,如果每个用户都有自己的vhost,那么我需要每个vhost有1个用户,因为我没有办法使用与rabbitmq相同的连接从多个vhost使用.

Der*_*ley 13

小清晰度:您应该发布到交换,并订阅队列.话虽这么说,你可能想要一个"ex-foo"和"ex-bar"用于你的交流...基本上每个用户一个.它可以以不同的方式完成,但这可行.


添加权限时,您可以使用正则表达式来设置允许用户执行的操作.

例如,使用rabbitmqctl命令行设置权限,您可以这样做:

rabbitmqctl set_permissions -p /myvhost tonyg "^tonyg-.*" ".*" ".*"

此命令指示RabbitMQ代理向名为tonyg的用户授予对名为/ myvhost的虚拟主机的访问权限,并对名称以"tonyg-"开头的所有资源具有配置权限,并对所有资源具有写入和读取权限.

请注意,三个"引号"中的权限顺序为:configure,write,read.

在您的情况下,您可能希望设置这样的权限:

  • vhost:mainvhost
  • 用户:foo
  • 配置: ""
  • 写道:"^ [ex-foo | Q-foo].*"
  • 读:"^ [ex-foo | Q-foo].*"

这将授予权限的foo用户读取和写入到开头的交易所或队列ex-fooQ-foo

你可能能够摆脱更严格的限制,比如

  • 写道:"^ ex-foo.*"
  • 读:"^ Q-foo.*"

在通过交换发布时,我不确定您是否需要对队列的写权限.我还没有必要在我的安全性中设置这种级别的粒度.

  • 在直接发布到队列的情况下,应添加默认交换 amq.default 的权限 ^(amq.default|Q-foo)$ (2认同)
  • 这不会阻止同一用户通过直接交换将消息发送到另一个队列(例如 P-foo)。 (2认同)