Spring AMQP + RabbitMQ 3.3.5 ACCESS_REFUSED: se rechazó el inicio de sesión mediante el mecanismo de autenticación PLAIN

94

Me estoy poniendo por debajo de la excepción

org.springframework.amqp.AmqpAuthenticationException: com.rabbitmq.client.AuthenticationFailureException: ACCESS_REFUSED - Se rechazó el inicio de sesión mediante el mecanismo de autenticación PLAIN. Para obtener más información, consulte el archivo de registro del intermediario.

Configuración: RabbitMQ 3.3.5 en Windows

En el archivo de configuración, %APPDATA%\RabbitMQ\rabbit.config hice el siguiente cambio según https://www.rabbitmq.com/access-control.html

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

También intenté crear un usuario / pwd: la prueba / prueba no parece hacer que funcione.

Probé los pasos de esta publicación.

Otros detalles de configuración son los siguientes:

Contexto de aplicación Spring alojado en 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>

En mi clase de controlador

@Autowired
RmqMessageSender rmqMessageSender;

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

En el remitente de Mi mensaje:

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());
        }
    }       
}

El bloque de excepción anterior da la excepción a continuación


org.springframework.amqp.AmqpAuthenticationException: com.rabbitmq.client.AuthenticationFailureException: ACCESS_REFUSED - Se rechazó el inicio de sesión mediante el mecanismo de autenticación PLAIN. Para obtener más información, consulte el archivo de registro del intermediario.


Registro de errores

  =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, busque debajo de la 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, avíseme si tiene alguna idea o sugerencia

Javaboy
fuente
Asegúrate de que la configuración que editas esté cargada.
pinepain
zaq178miami, he realizado algunos pasos para asegurarme de que esté cargado. Reinicie el servicio, reinicie la máquina e incluso vuelva a instalar RabbitMQ.
Javaboy

Respuestas:

107

Estoy seguro de que lo que Artem Bilan ha explicado aquí podría ser una de las razones de este error:

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

pero la solución para mí fue que inicié sesión en la página de administración de rabbitMQ ( http: // localhost: 15672 / # / users ) con el nombre de usuario y la contraseña predeterminados que es invitado / invitado, luego agregué un nuevo usuario y para ese nuevo usuario yo habilitó el permiso para acceder a él desde el host virtual y luego usó el nuevo nombre de usuario y contraseña en lugar del invitado predeterminado y eso borró el error.

ingrese la descripción de la imagen aquí

grepit
fuente
3
Tampoco me está funcionando. Conexión con el invitado: el invitado está bien. Conexión con newUser: newPwd está dando este error. ¡No tengo idea de por qué!
Shashank
1
Yo tuve el mismo problema. Siguiendo esta sugerencia resolvió este problema.
Christian Del Bianco
46

Para completar la respuesta de @ cpu-100 ,

en caso de que no desee habilitar / usar la interfaz web, puede crear nuevas credenciales usando la línea de comando como se muestra a continuación y usarla en su código para conectarse a RabbitMQ.

$ rabbitmqctl add_user YOUR_USERNAME YOUR_PASSWORD
$ rabbitmqctl set_user_tags YOUR_USERNAME administrator
$ rabbitmqctl set_permissions -p / YOUR_USERNAME ".*" ".*" ".*"
Rahman
fuente
2
Gracias, no tengo experiencia con RabbitMQ, y esta fue una solución rápida para obtener una conexión remota a un servidor proveniente de una AMI de AWS para experimentar y ver si debería investigar más.
jbm
36

el usuario 'invitado' solo puede conectarse a través de localhost

Eso es cierto desde RabbitMQ 3.3.x. Por lo tanto, debe actualizar a la misma versión de la biblioteca cliente, o simplemente actualizar Spring AMQP a la última versión (si usa el sistema de administración de dependencias).

Versión anterior del cliente utilizada 127.0.0.1como valor predeterminado para la hostopción de ConnectionFactory.

Artem Bilan
fuente
Hola Artem, he agregado la entrada pom.xml para las versiones de jar. Idealmente, me gustaría evitar el uso de nombre de usuario y contraseña de invitado. ¿Podría hacerme saber si tiene alguna sugerencia utilizable para un caso de uso / prueba de concepto listo para prod en el senario anterior?
Javaboy
Lo siento, no está claro a qué te refieres con "prod ready Use Case / Proof of concept in above senario", porque no veo ninguna pregunta sobre casos de uso aquí. Siéntase libre de crear cualquier usuario en RabbitMQ Broker.
Artem Bilan
La solución simple es especificar localhostasí:ConnectionFactory("localhost")
Brent Bradburn
¡Para Azure UbuntuVM, con la guest/guestcuenta IP asignada a Azure funciona globalmente! :(
Dev Anand Sadasivam
14

El error

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

puede ocurrir si las credenciales que su aplicación está intentando usar para conectarse a RabbitMQ son incorrectas o faltan.

Esto sucedió cuando las credenciales de RabbitMQ almacenadas en el web.configarchivo de mi aplicación ASP.NET tenían un valor de ""para la contraseña en lugar del valor real de la cadena de contraseña.

Jon Schneider
fuente
1
Sí, tenga cuidado con los errores tipográficos. :-)
Sundar Annamalai
6

Para permitir el acceso de invitados de forma remota, escriba esto

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

hacia aqui

c:\Users\[your user name]\AppData\Roaming\RabbitMQ\rabbitmq.config

luego reinicie el servicio de windows rabbitmq (Fuente https://www.rabbitmq.com/access-control.html )

Peter Szanto
fuente
3

Para mí, la solución fue simple: el nombre de usuario distingue entre mayúsculas y minúsculas. No utilizar las mayúsculas correctas también provocará el error.

Michel van Engelen
fuente
2

Nueva solucion:

El módulo de nodo no puede manejar :una contraseña correctamente. Incluso la URL codificada, como funcionaría normalmente, no funciona.

¡No utilice caracteres especiales típicos de una URL en la contraseña!

Como uno de los siguientes: : . ? + %


Respuesta original incorrecta:

El mensaje de error se queja claramente sobre el uso PLAIN, no significa que las credenciales sean incorrectas, significa que debe usar la entrega de datos cifrados (TLS) en lugar de texto sin formato.

Cambiar amqp://la cadena de conexión a amqps://(tenga en cuenta s) resuelve esto.

Daniel W.
fuente
2

simplemente agregue la contraseña de inicio de sesión para conectarse a RabbitMq

 CachingConnectionFactory connectionFactory = 
         new CachingConnectionFactory("rabbit_host");

 connectionFactory.setUsername("login");
 connectionFactory.setPassword("password");
benderalex5
fuente
2

Si usa el número como contraseña, tal vez debería intentar cambiar su contraseña usando una cadena.

Puedo iniciar sesión usando deltaqin: 000000 en el sitio web, pero tuve esto mientras ejecutaba el programa. luego cambie la contraseña a deltaiqn. y funciona.

dianerta
fuente
0

Hice exactamente lo que hizo @grepit.

Pero tuve que hacer algunos cambios en mi código Java:

En el proyecto Producer and Receiver modifiqué:

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

        

Al hacer eso, está conectando un host específico como el usuario que ha creado. ¡Esto funciona para mi!

Evandro Brunassi
fuente
0

Me enfrentaba a este problema debido al espacio vacío al final de la contraseña (spring.rabbitmq.password = rabbit) en la aplicación de arranque de primavera. Las propiedades se resolvieron al eliminar el espacio vacío. Espero que esta lista de verificación ayude a alguien a enfrentar este problema.

Mallikarjun Revgond
fuente
-4

establecer ConnectionFactory o Connection nombre de host en localhost

wen
fuente