【问题标题】:Translate PCRE to RabbitMQ/Erlang regex将 PCRE 转换为 RabbitMQ/Erlang 正则表达式
【发布时间】:2020-07-30 06:50:00
【问题描述】:

我正在为 RabbitMQ 设置用户帐户和权限。 这个想法是用户被称为“user1”,“user2”,......并且有一个单独的队列“所有用户” - 你猜对了 - 所有用户都可以访问。

我想出了以下正则表达式:

^user[0-9]+|all\-users$

并在https://regex101.com/进行了测试

bob [no match]
alice [no match]
user5 [match]
user99 [match]
user [no match]
all-users [match]

它按预期工作。 但是,我的 RabbitMQ 并非如此。 具体来说,当使用任何user{n} 帐户发布到all-users 时,我得到一个403 - ACCESS REFUSED。 如果我将写入权限更改为.*,它可以正常工作,但这不是我想要的。

我还尝试了对我的正则表达式的以下修改,这些修改在 RabbitMQ 中都不起作用,但它们大多在 regex101 中起作用:

  • ^user[0-9]+|^all-users$(不转义破折号)
  • ^(user[0-9]+|all-users)$(只有一组括号)
  • ^user[0-9]+|^all\\-users$(双转义破折号 - 不起作用)
  • ^(user[0-9]+)|(all\-users)$(使用群组)
  • (^user[0-9]+$)|(^all\-users$)(使用组中的开始/结束标记)
  • ^user[0-9]+|^all\-users(省略结束标记 - 也与组组合)
  • user[0-9]+|all-users(省略所有标记)

我知道其他人也问过类似的问题(herehere),但(就像我自己的问题一样)他们都很具体,对我的问题没有多大帮助。

附: 我正在使用 RabbitMQ 管理 UI 来设置权限以便于调试,但是在命令行上设置它们的效果完全相同

【问题讨论】:

  • 首先,正则表达式必须是^(user[0-9]+|all-users)$,用一个组来使anchors影响所有的alternatives。
  • 这也不起作用 - 有或没有转义破折号:(
  • 是的,很可能,因为您使用的方法不接受正则表达式。

标签: regex rabbitmq erlang


【解决方案1】:

好吧,睡了一夜好觉之后,我又看了一遍(不是很精彩)RabbitMQ 文档。

我的示例基于rabbitmqctl 的文档,其中显示了如何“对名称以“janeway-”开头的所有资源设置权限:

"^janeway-.*"

但是,access control docs 包含不同操作所需的权限表。 basic.publish 操作(将消息发布到队列)需要(对我来说非常违反直觉)exchange 的写入权限,而不是队列。 我没有使用自定义交换,在我的 python 代码中将该字段留空 - 显然 - 导致使用默认交换 (amq.default)。问题是我一直使用的用户帐户有权访问名为“user1”、“user2”、...和“all-users”的资源,但不包括amq.default



TL;DR

权限应该是

^(user[0-9]+|all-users|amq.default)$

或其变体。

【讨论】:

    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    相关资源
    最近更新 更多