Перевести PCRE на RabbitMQ / Erlang regex - PullRequest
1 голос
/ 17 апреля 2020

Я настраиваю учетные записи пользователей и разрешения для 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. В частности, при публикации на all-users с использованием любой учетной записи user{n} я получаю 403 - ACCESS REFUSED. Если я изменяю разрешение на запись на .*, оно работает нормально, но это не то, что я хочу.

I также попробовал следующие модификации моего регулярного выражения, ни одна из которых не работает в RabbitMQ, но они в основном работают в регулярном выражении regex101:

  • ^user[0-9]+|^all-users$ (без экранирования da sh)
  • ^(user[0-9]+|all-users)$ (только с одним набором скобок)
  • ^user[0-9]+|^all\\-users$ (двойное экранирование da sh - не работает)
  • ^(user[0-9]+)|(all\-users)$ (с использованием групп)
  • (^user[0-9]+$)|(^all\-users$) (с использованием маркеров начала / конца в группах)
  • ^user[0-9]+|^all\-users (без маркера конца - также в сочетании с группами)
  • user[0-9]+|all-users (пропуская все маркеры)

Я знаю, что другие люди задавали подобные вопросы ( здесь или здесь ), но (как и мой собственный вопрос) они все они довольно точны c и не сильно мне помогают в моей проблеме.

PS: я использую интерфейс управления RabbitMQ для установки разрешений для упрощения отладки, но установка их в командной строке точно такой же эффект RabbitMQ Managenment UI

1 Ответ

1 голос
/ 17 апреля 2020

ОК, так что после хорошего ночного сна я еще раз взглянул на (не блестящую) документацию RabbitMQ.

Я основал свой пример на документации для rabbitmqctl, где в нем показано, как установить разрешения "для всех ресурсов, имена которых начинаются с" janeway - "":

"^janeway-.*"

Однако документы для контроля доступа содержат таблицу разрешений, необходимых для различных операций. , Операция basic.publish (публикация сообщения в очереди) требует (довольно нелогично для меня) разрешений на запись в exchange , а не в очередь. Я не использовал пользовательский обмен, оставив поле пустым в своем коде python, что, по-видимому, привело к использованию обмена по умолчанию (amq.default). Проблема заключалась в том, что используемая мной учетная запись имела разрешения на доступ к ресурсам с именами «user1», «user2», ... и «все пользователи», но не включала amq.default.

TL; DR :

Разрешения должны были быть

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

или их вариант.

...