Spring AMQP + RabbitMQ 3.3.5 ACCESS_REFUSED - Login foi recusado usando o mecanismo de autenticação PLAIN


92

Estou ficando abaixo da exceção

org.springframework.amqp.AmqpAuthenticationException: com.rabbitmq.client.AuthenticationFailureException: ACCESS_REFUSED - O login foi recusado usando o mecanismo de autenticação PLAIN. Para obter detalhes, consulte o arquivo de log do broker.

Configuração: RabbitMQ 3.3.5 no Windows

No arquivo de configuração %APPDATA%\RabbitMQ\rabbit.config , fiz as alterações abaixo de acordo com https://www.rabbitmq.com/access-control.html

[{rabbit, [{loopback_users, []}]}].

Eu também tentei criar um usuário / pwd - test / test não parece funcionar.

Tentei as etapas deste post.

Outros detalhes de configuração são os seguintes:

Contexto do aplicativo Spring hospedado por Tomcat:

<!-- Rabbit MQ configuration Start -->
    <!-- Connection Factory -->
    <rabbit:connection-factory id="rabbitConnFactory" virtual-host="/" username="guest" password="guest" port="5672"/>

    <!-- Spring AMQP Template -->
    <rabbit:template id="rabbitTemplate" connection-factory="rabbitConnFactory" routing-key="ecl.down.queue" queue="ecl.down.queue" />

    <!-- Spring AMQP Admin -->
    <rabbit:admin id="admin" connection-factory="rabbitConnFactory"/>

    <rabbit:queue id="ecl.down.queue" name="ecl.down.queue" />

    <rabbit:direct-exchange name="ecl.down.exchange">
        <rabbit:bindings>
            <rabbit:binding key="ecl.down.key" queue="ecl.down.queue"/>
        </rabbit:bindings>
    </rabbit:direct-exchange>

Na minha classe de controlador

@Autowired
RmqMessageSender rmqMessageSender;

//Inside a method
rmqMessageSender.submitToECLDown(orderInSession.getOrderNo());

Em minha mensagem remetente:

import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component("messageSender")
public class RmqMessageSender  {

    @Autowired
    AmqpTemplate                rabbitTemplate;

    public void submitToRMQ(String orderId){
        try{
            rabbitTemplate.convertAndSend("Hello World");
        } catch (Exception e){
            LOGGER.error(e.getMessage());
        }
    }       
}

O bloco da exceção acima fornece a exceção abaixo


org.springframework.amqp.AmqpAuthenticationException: com.rabbitmq.client.AuthenticationFailureException: ACCESS_REFUSED - O login foi recusado usando o mecanismo de autenticação PLAIN. Para obter detalhes, consulte o arquivo de log do broker.


Log de Erros

  =ERROR REPORT==== 7-Nov-2014::18:04:37 ===
closing AMQP connection <0.489.0> (10.1.XX.2XX:52298 -> 10.1.XX.2XX:5672):
    {handshake_error,starting,0,
                     {amqp_error,access_refused,
                                 "PLAIN login refused: user 'guest' can only connect via localhost",
                                 'connection.start_ok'}}

Por favor, encontre abaixo a entrada pom.xml

        <dependency>
            <groupId>org.springframework.amqp</groupId>
            <artifactId>spring-rabbit</artifactId>
            <version>1.3.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-amqp</artifactId>
            <version>4.0.4.RELEASE</version>
        </dependency>

Por favor, deixe-me saber se você tem alguma opinião / sugestão


Certifique-se de que a configuração que você editou está carregada.
pinepain

zaq178miami, dei alguns passos para ter certeza de que está carregado. Reinicie o serviço, reinicie a máquina e instale novamente o RabbitMQ.
Javaboy de

Respostas:


104

Tenho certeza de que o que Artem Bilan explicou aqui pode ser um dos motivos para esse erro:

Caused by: com.rabbitmq.client.AuthenticationFailureException: 
ACCESS_REFUSED - Login was refused using authentication mechanism PLAIN. 
For details see the

mas a solução para mim foi fazer o login na página de administração do rabbitMQ ( http: // localhost: 15672 / # / users ) com o nome de usuário e senha padrão que é convidado / convidado, em seguida, adicionei um novo usuário e para esse novo usuário I habilitou a permissão para acessá-lo do host virtual e, em seguida, usou o novo nome de usuário e senha em vez do convidado padrão e isso eliminou o erro.

insira a descrição da imagem aqui


2
Também não está funcionando para mim. Conexão com o convidado: o convidado está bem. Conexão com newUser: newPwd está apresentando este erro. Não tenho ideia do porquê !!
Shashank

1
Eu tive o mesmo problema. Seguindo essa sugestão, ele resolveu o problema.
Christian Del Bianco

43

Para completar a resposta @ cpu-100 ,

caso você não queira habilitar / usar a interface web, você pode criar uma nova credencial usando a linha de comando como abaixo e usá-la em seu código para se conectar ao RabbitMQ.

$ rabbitmqctl add_user YOUR_USERNAME YOUR_PASSWORD
$ rabbitmqctl set_user_tags YOUR_USERNAME administrator
$ rabbitmqctl set_permissions -p / YOUR_USERNAME ".*" ".*" ".*"

1
Obrigado, não tenho nenhuma experiência com RabbitMQ, e esta foi uma solução rápida para obter uma conexão remota com um servidor criado a partir de um AWS AMI para experimentar e ver se devo examiná-lo mais a fundo.
jbm

36

o usuário 'convidado' só pode se conectar via host local

Isso é verdade desde RabbitMQ 3.3.x. Portanto, você deve atualizar para a mesma versão da biblioteca do cliente ou apenas atualizar Spring AMQP para a versão mais recente (se você usar o sistema de gerenciamento de dependências).

A versão anterior do cliente usada 127.0.0.1como valor padrão para a hostopção de ConnectionFactory.


Oi Artem, adicionei a entrada pom.xml para versões do jar. O ideal é evitar o uso de nome de usuário e senha de convidado. Você poderia me informar se tiver alguma indicação utilizável para um caso de uso / prova de conceito pronto para produção no cenário acima?
Javaboy de

Desculpe, não está claro o que você quer dizer com relação a `caso de uso / prova de conceito pronto para produto no cenário acima`, porque não vejo nenhuma questão de caso de uso aqui. Sinta-se à vontade para criar qualquer usuário no RabbitMQ Broker.
Artem Bilan de

A solução simples é especificar da seguinte localhostforma:ConnectionFactory("localhost")
Brent Bradburn

Para azure UbuntuVM, com a guest/guestconta de ip atribuída azure funciona globalmente! :(
Dev Anand Sadasivam

13

O erro

ACCESS_REFUSED - Login was refused using authentication mechanism PLAIN. For details see the broker logfile.

pode ocorrer se as credenciais que seu aplicativo está tentando usar para se conectar ao RabbitMQ estiverem incorretas ou ausentes.

Isso aconteceu quando as credenciais RabbitMQ armazenadas no web.configarquivo do meu aplicativo ASP.NET tinham um valor de ""para a senha em vez do valor real da string da senha.


1
Sim - atente para erros de digitação. :-)
Sundar Annamalai


3

Para mim, a solução era simples: o nome de usuário diferencia maiúsculas de minúsculas. Deixar de usar as tampas corretas também levará ao erro.


2

Nova solução:

O módulo de nó não pode lidar : com uma senha corretamente. Mesmo url codificado, como funcionaria normalmente, não funciona.

Não use caracteres especiais típicos de um URL na senha!

Como um dos seguintes: : . ? + %


Original, resposta errada:

A mensagem de erro claramente reclama sobre o uso PLAIN, isso não significa que as credenciais estão erradas, significa que você deve usar entrega de dados criptografados (TLS) em vez de texto simples.

Alterar amqp://a string de conexão para amqps://(observe o s) resolve isso.


2

basta adicionar a senha de login para se conectar ao RabbitMq

 CachingConnectionFactory connectionFactory = 
         new CachingConnectionFactory("rabbit_host");

 connectionFactory.setUsername("login");
 connectionFactory.setPassword("password");

2

se você usar o número como sua senha, talvez você deva tentar alterar sua senha usando string.

Posso fazer o login usando deltaqin: 000000 no site, mas fiz isso durante a execução do programa. em seguida, altere a senha para deltaiqn. e funciona.


0

Fiz exatamente o que @grepit fez.

Mas eu tive que fazer algumas mudanças no meu código Java:

No projeto Produtor e Receptor, alterei:

ConnectionFactory factory = new ConnectionFactory();
factory.setHost("your-host-ip");
factory.setUsername("username-you-created");
factory.setPassword("username-password");

        

Fazendo isso, você está conectando um host específico como o usuário que você criou. Funciona para mim!


0

Eu estava enfrentando esse problema devido ao espaço vazio no final da senha (spring.rabbitmq.password = rabbit) no spring boot application.properties foi resolvido na remoção do espaço vazio. Espero que esta lista de verificação ajude alguém a enfrentar esse problema.


-3

definir ConnectionFactory ou Connection hostname para localhost

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.