Permissões para exchanges do tipo TOPIC RabbitMQ com MQTT e Stomp
O sistema de permissões do RabbitMQ é esquisito quando usamos o protocolo MQTT e o Stomp.
Antes do RabbitMQ 3.7 não era possível limitar quais tópicos cada usuário poderia dar publish ou subscribe. A única possibilidade era: permitir leitura na exchange inteira e/ou permitir escrita na exchange inteira. Essa configuração era feita através das autorizações de nível "Permissions".
No RabbitMQ 3.7 e posteriores, além da tradicional "Permissions" criou-se um novo nível de autorização chamado "Topic Permissions" e nele é possível definir quais tópicos podem ser lidos e escritos por um usuário (usando expressões regulares, regex).
Quando uma conexão MQTT é aberta com o RabbitMQ, uma conexão e um canal são abertos.
Ao fazer um SUBSCRIBE em algum tópico, o MQTT cria uma fila no vhost / com o nome:
mqtt-subscription-qos
Para que essa fila seja criada, é preciso que o usuário tenha as permissões a nível de "Permissions" em:
vhost /
configure em: mqtt-subscription-
read em: mqtt-subscription-
write em: mqtt-subscription-
Transformando isso para regex temos (note que estou aceitando qualquer mqtt client id):
virtual host: /configure regexp: ^mqtt-subscription-.+$ write regexp: ^mqtt-subscription-.+$ read regexp: ^(mqtt-subscription-.+)|(amq\.topic)$
Para ter permissões de leitura e escrita:
user: tiagovirtual host: / configure regexp: ^mqtt-subscription-.+$ write regexp: ^(mqtt-subscription-.+)|(amq\.topic)$ read regexp: ^(mqtt-subscription-.+)|(amq\.topic)$
Já na topic permission, da seguinte forma:
user: tiagovirtual host: / exchange: amq.topic write regexp: ^tiago(\.\w+)*$ read regexp: ^tiago(\.\w+)*$
A regex ^tiago(.\w+)*$ reconhece o seguintes textos:
tiago
tiago.123
tiago.asd
tiago.asd 123 asd
tiago.asd.dsa.123.abc
A regex não aceita nada que não começar com tiago.
Referências
Documentação sobre controle de acesso e autorizações no RabbitMQ
https://www.rabbitmq.com/access-control.html