【问题标题】:RabbitMQ queue publish access refusedRabbitMQ 队列发布访问被拒绝
【发布时间】:2019-01-07 07:37:19
【问题描述】:

为用户设置权限以仅向特定队列授予发布权限Q1

权限

配置:“”

写:^(Q1)|(amqp.default)$

阅读:“”

使用的协议:STOMP

RMQ 版本:3.6.X

使用上述权限发布到Q1时,访问被拒绝。

如果 Configure 设置为 ^(Q1)$,它可以正常工作。但是设置配置权限也将允许用户在 Q1 上进行 queue.delete 和 queue.declare 操作。

案例:从后端/RMQ 管理创建一个队列,以便 stomp 客户端可以通过直接 amqp.default 交换和路由键作为队列名称向其发布。这样客户端只有队列的写入权限,没有配置或读取权限

如果用户只需要发布到队列而不读取或配置队列,那么最好的解决方案是什么?

【问题讨论】:

    标签: javascript rabbitmq rabbitmq-stomp


    【解决方案1】:

    首先,请记住您发布到 RabbitMQ 中的 exchanges,而不是队列。然后,阅读this table 以确定配置、写入和读取权限如何应用于您想要执行的操作。

    最后,由于使用了STOMP插件,用户必须拥有configure权限才能创建回复队列。这是因为 STOMP 在 RabbitMQ (code) 中的实现方式。


    注意:RabbitMQ 团队监控the rabbitmq-users mailing list,并且有时只回答 StackOverflow 上的问题。

    【讨论】:

    • 我知道我们发布到交易所而不是队列,因此 amqp.default 授予写入权限,因为 amqp.default 是交易所并且 Q1 将是路由键。因此消息被发布到默认交换并路由到路由键。为什么设置写权限时,路由键需要配置权限?
    • 交易所名称为amq.default,默认直接交易所。如果您的代码尝试声明队列,则需要配置权限。我怀疑您的问题与未使用正确的交换名称并尝试声明队列有关(这确实需要配置权限)
    • 已经通过后端代码/rabbitmq 管理 ui 生成了一个持久队列,因此客户端(JavaScript)只需使用路由密钥发布到默认交换。因此客户端不必配置或创建队列。所有客户端都将拥有此队列的写入权限,但没有配置或读取权限。使用 stomp 的示例var client = Stomp.over(ws) client.send('/queue/Q1',{ "content-type": "text/plain" }, 'Hello');
    • 通过我假设的rabbitmq-web-stomp 插件提及您正在使用stomp 协议会很有帮助。 RabbitMQ (code) 中实现 STOMP 协议的方式需要配置权限才能创建回复队列。
    • 很抱歉没有提到使用的协议。感谢您的链接,为什么它与其他协议相比在 stomp 上有所不同?
    【解决方案2】:

    STOMP 协议需要配置权限,因此不得不想出不同的方法。(RabbitMQ code)

    创建了一个交换E1并授予用户写入权限

    将队列 Q1 绑定到 E1,以便发布到 E1 的每条消息都会路由到 Q1

    在这种方法中,STOMP 客户端只需要写入权限即可发布到交换E1,无需读取或配置权限

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-05
      • 2017-06-17
      • 2020-07-29
      • 1970-01-01
      • 1970-01-01
      • 2012-10-16
      相关资源
      最近更新 更多