Ошибка CONNECT при попытке подписаться на очередь сообщений

Я совершенно новичок в RabbitMQ, и теперь я ищу ошибку конфигурации. Клиент не получает никаких сообщений от RabbitMQ, и я отладил его, насколько это было возможно.

Внешние сообщения:

Сообщение 1:

CONNECT
login:frontend_listener
passcode:xxx
accept-version:1.0,1.1,1.2
heart-beat:20000,0

Сообщение 2:

ERROR
message:Bad CONNECT
content-type:text/plain
version:1.0,1.1,1.2
content-length:30

Virtual host '/' access denied

Есть два виртуальных хоста: / и someVhost, и есть разные пользователи, такие как frontend_listener. Теперь я нашел способ получить доступ к файлу журнала.

Файл журнала RabbitMQ:

2020-02-11 15:50:53.579 [warning] <0.798.0> STOMP login failed for user "frontend_listener"
2020-02-11 15:50:53.579 [error] <0.798.0> STOMP error frame sent:
Message: "Bad CONNECT"
Detail: "Access refused for user 'frontend_listener'\n"
Server private detail: none
...
2020-02-11 15:51:25.349 [info] <0.850.0> Creating user 'frontend_listener'
2020-02-11 15:51:30.374 [info] <0.857.0> Setting permissions for 'frontend_listener' in 'someVhost' to '$', '$', 'client-notification.*'
2020-02-11 15:51:54.980 [warning] <0.867.0> STOMP login failed - not_allowed (vhost access not allowed)~n
2020-02-11 15:51:54.980 [error] <0.867.0> STOMP error frame sent:
Message: "Bad CONNECT"
Detail: "Virtual host '/' access denied"
Server private detail: none
2020-02-11 15:52:56.427 [warning] <0.875.0> STOMP login failed - not_allowed (vhost access not allowed)~n

Это читается как неправильные разрешения. Может ли кто-нибудь помочь мне правильно интерпретировать это?

Пытаюсь прочитать: Пользователь frontend_listener хочет получить доступ к vHost /, но у него недостаточно прав (не знаю, что здесь означает $, кроме как часть регулярного выражения). Дело в том, что я не знаю, правильный ли это vHost. Как узнать URL каждого виртуального хоста?

Я спрашиваю об этом, потому что считаю, что сопоставление с vHost неверно или чего-то не хватает.

Изменить:

После добавления host: 'someVhost' к моему stomp-config.ts я смог подписаться на очереди. Теперь я получаю следующую ошибку в журнале:

2020-02-12 16:32:25.913 [error] <0.5159.1> Channel error on connection <0.5149.1> (127.0.0.1:58136 -> 127.0.0.1:15674, vhost: 'someVhost', user: 'frontend_listener'), channel 1:
operation basic.consume caused a channel exception access_refused: access to queue 'stomp-subscription-SZ3-PO1-PbZroPol-WXSQw' in vhost 'someVhost' refused for user 'frontend_listener'
2020-02-12 16:32:26.022 [error] <0.5145.1> STOMP error frame sent:
Message: access_refused

На интерфейсе я не получаю сообщения или ошибки.


person testing    schedule 12.02.2020    source источник


Ответы (1)


Вам также необходимо передать информацию о хосте в кадре STOMP CONNECT.

это то, что говорится в спецификациях, и клиенты ДОЛЖНЫ установить этот заголовок

host : имя виртуального хоста, к которому хочет подключиться клиент. Клиентам рекомендуется установить это имя хоста, для которого был установлен сокет, или любое другое имя по своему выбору. Если этот заголовок не соответствует известному виртуальному хосту, серверы, поддерживающие виртуальный хостинг, МОГУТ выбрать виртуальный хост по умолчанию или отклонить соединение.

Так вот как должна выглядеть ваша рама CONNET

CONNECT
login:frontend_listener
passcode:xxx
accept-version:1.0,1.1,1.2
host: someVhost
heart-beat:20000,0
person Atmanirbhar Bharat    schedule 12.02.2020
comment
Спецификацию можно найти здесь stomp.github.io/ и др. полезная ссылка: rabbitmq.com/vhosts.html - person Atmanirbhar Bharat; 12.02.2020
comment
Спасибо за Ваш ответ. Кажется, я на шаг впереди. Что я не понимаю, что старая конфигурация работает на другом экземпляре (без конфигурации host). Теперь я получаю сообщение access_refused. Не могли бы вы помочь и с этим? - person testing; 12.02.2020
comment
Таким образом, причиной работы без конфигурации хоста на другом экземпляре может быть одна из двух. 1. Экземпляр имеет единственный хост с именем someVhost или 2. Хост с именем someVhost является хостом по умолчанию. - person Atmanirbhar Bharat; 12.02.2020
comment
Также убедитесь, что пользователь fontend_listener имеет разрешение на настройку, запись и чтение на хосте someVhost. - person Atmanirbhar Bharat; 12.02.2020
comment
В настоящее время разрешение '$', '$', 'client-notification.*' для настройки, записи и чтения. Если я хочу предоставить доступ только для чтения, разве этого будет недостаточно? - person testing; 12.02.2020
comment
Теперь я установил разрешения * для всех, и это сработает. Оба экземпляра имеют два виртуальных хоста, поэтому должна быть разница в конфигурации. Вы знаете, как я могу установить хост по умолчанию? - person testing; 13.02.2020
comment
Да, vhost по умолчанию можно определить в файле rabbitmq.conf, по умолчанию это default_vhost = / - person Atmanirbhar Bharat; 14.02.2020
comment
Далее читайте rabbitmq.com/configure.html#config-items - person Atmanirbhar Bharat; 14.02.2020
comment
Спасибо за вашу помощь. Сейчас распечатал конфиг с rabbitmqctl environment и получаю {default_vhost,<<"/">>}, на рабочую среду. Может где-то есть конфиг? - person testing; 14.02.2020
comment
Неважно. Кажется, это проблема неправильной настройки докера. - person testing; 14.02.2020