将 PCRE 翻译成 RabbitMQ/Erlang 正则表达式
Translate PCRE to RabbitMQ/Erlang regex
我正在为 RabbitMQ 设置用户帐户和权限。
这个想法是用户被称为 "user1, "user2",... 并且有一个单独的队列 "all-users" - 你猜对了 - 所有用户都可以访问。
我想出了以下正则表达式:
^user[0-9]+|all\-users$
进行了测试
bob [no match]
alice [no match]
user5 [match]
user99 [match]
user [no match]
all-users [match]
它按预期工作。
但是,我的 RabbitMQ 却不是这样。
具体来说,当使用任何 user{n}
帐户发布到 all-users
时,我得到一个 403 - ACCESS REFUSED
。
如果我将写权限更改为 .*
它工作正常,但这不是我想要的。
我还尝试对我的正则表达式进行以下修改,none 其中在 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$)
(在组中使用 start/end 标记)
^user[0-9]+|^all\-users
(省略结束标记 - 也与组组合)
user[0-9]+|all-users
(省略所有标记)
我知道其他人也问过类似的问题 (here or here),但是(就像我自己的问题一样)他们都很具体,对我的问题帮助不大。
P.S.:
我正在使用 RabbitMQ Management UI 设置权限以便于调试,但在命令行上设置它们具有完全相同的效果
好的,在睡了一夜好觉之后,我又看了一遍(不是很出色的)RabbitMQ 文档。
我的示例基于 rabbitmqctl
的文档,其中展示了如何设置“对名称以“janeway-”开头的所有资源”的权限:
"^janeway-.*"
但是,access control docs 包含不同操作所需的 table 权限。 basic.publish
操作(将消息发布到队列)需要(对我来说非常违反直觉)对 exchange 的写入权限,而不是队列。
我没有使用自定义交换,在我的 python 代码中将字段留空,这显然导致使用默认交换 (amq.default
)。问题是我一直使用的用户帐户有权访问名为“user1”、“user2”...和“all-users”的资源,但不包括 amq.default
.
TL;DR:
权限应该是
^(user[0-9]+|all-users|amq.default)$
或其变体。
我正在为 RabbitMQ 设置用户帐户和权限。 这个想法是用户被称为 "user1, "user2",... 并且有一个单独的队列 "all-users" - 你猜对了 - 所有用户都可以访问。
我想出了以下正则表达式:
^user[0-9]+|all\-users$
进行了测试
bob [no match]
alice [no match]
user5 [match]
user99 [match]
user [no match]
all-users [match]
它按预期工作。
但是,我的 RabbitMQ 却不是这样。
具体来说,当使用任何 user{n}
帐户发布到 all-users
时,我得到一个 403 - ACCESS REFUSED
。
如果我将写权限更改为 .*
它工作正常,但这不是我想要的。
我还尝试对我的正则表达式进行以下修改,none 其中在 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$)
(在组中使用 start/end 标记)^user[0-9]+|^all\-users
(省略结束标记 - 也与组组合)user[0-9]+|all-users
(省略所有标记)
我知道其他人也问过类似的问题 (here or here),但是(就像我自己的问题一样)他们都很具体,对我的问题帮助不大。
P.S.:
我正在使用 RabbitMQ Management UI 设置权限以便于调试,但在命令行上设置它们具有完全相同的效果
好的,在睡了一夜好觉之后,我又看了一遍(不是很出色的)RabbitMQ 文档。
我的示例基于 rabbitmqctl
的文档,其中展示了如何设置“对名称以“janeway-”开头的所有资源”的权限:
"^janeway-.*"
但是,access control docs 包含不同操作所需的 table 权限。 basic.publish
操作(将消息发布到队列)需要(对我来说非常违反直觉)对 exchange 的写入权限,而不是队列。
我没有使用自定义交换,在我的 python 代码中将字段留空,这显然导致使用默认交换 (amq.default
)。问题是我一直使用的用户帐户有权访问名为“user1”、“user2”...和“all-users”的资源,但不包括 amq.default
.
TL;DR:
权限应该是
^(user[0-9]+|all-users|amq.default)$
或其变体。