Spring AMQP + RabbitMQ 3.3.5 ACCESS_REFUSED - L'accesso è stato rifiutato utilizzando il meccanismo di autenticazione PLAIN


92

Sto ottenendo sotto l'eccezione

org.springframework.amqp.AmqpAuthenticationException: com.rabbitmq.client.AuthenticationFailureException: ACCESS_REFUSED - L'accesso è stato rifiutato utilizzando il meccanismo di autenticazione PLAIN. Per i dettagli, vedere il file di registro del broker.

Configurazione: RabbitMQ 3.3.5 su Windows

Sul file di configurazione in %APPDATA%\RabbitMQ\rabbit.config ho fatto di seguito la modifica come da https://www.rabbitmq.com/access-control.html

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

Ho anche provato a creare un utente / pwd - test / test non sembra farlo funzionare.

Ho provato i passaggi da questo post.

Altri dettagli di configurazione sono i seguenti:

Contesto dell'applicazione Spring ospitato da 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>

Nella mia classe Controller

@Autowired
RmqMessageSender rmqMessageSender;

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

Nel mittente del mio messaggio:

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

Sopra l'eccezione Block dà sotto l'eccezione


org.springframework.amqp.AmqpAuthenticationException: com.rabbitmq.client.AuthenticationFailureException: ACCESS_REFUSED - L'accesso è stato rifiutato utilizzando il meccanismo di autenticazione PLAIN. Per i dettagli, vedere il file di registro del broker.


Registro errori

  =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'}}

Pls trova sotto la voce 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>

Per favore fatemi sapere se avete pensieri / suggerimenti


Assicurati che la configurazione che modifichi sia caricata.
Pinepain

zaq178miami, ho fatto pochi passaggi per assicurarmi che fosse caricato. Riavvia il servizio, riavvia la macchina e reinstalla anche RabbitMQ.
Javaboy

Risposte:


104

Sono sicuro che quello che Artem Bilan ha spiegato qui potrebbe essere uno dei motivi di questo errore:

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

ma la soluzione per me è stata che ho effettuato l'accesso alla pagina di amministrazione di rabbitMQ ( http: // localhost: 15672 / # / users ) con il nome utente e la password predefiniti che è guest / guest, quindi ho aggiunto un nuovo utente e per quel nuovo utente ho ha abilitato l'autorizzazione per accedervi dall'host virtuale e quindi ha utilizzato il nuovo nome utente e password invece del guest predefinito e questo ha cancellato l'errore.

inserisci qui la descrizione dell'immagine


2
Non funziona neanche per me. Connessione con l'ospite: l'ospite va bene. Connessione con newUser: newPwd sta dando questo errore. Non ho idea del perché !!
Shashank

1
Ho avuto lo stesso problema. Seguendo questo suggerimento ha risolto questo problema.
Christian Del Bianco

43

Per completare la risposta @ cpu-100 ,

nel caso in cui non si desideri abilitare / utilizzare l'interfaccia web, è possibile creare nuove credenziali utilizzando la riga di comando come di seguito e utilizzarla nel codice per connettersi a RabbitMQ.

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

1
Grazie, non ho esperienza con RabbitMQ e questa è stata una soluzione rapida per ottenere una connessione remota a un server attivato da un'AMI AWS per fare esperimenti e vedere se dovessi esaminarla ulteriormente.
jbm

36

l'utente "guest" può connettersi solo tramite localhost

Questo è vero poiché RabbitMQ 3.3.x. Quindi è necessario eseguire l'upgrade alla stessa versione della libreria client o semplicemente aggiornare Spring AMQP alla versione più recente (se si utilizza il sistema di gestione delle dipendenze).

Versione precedente del client utilizzata 127.0.0.1come valore predefinito per l' hostopzione di ConnectionFactory.


Ciao Artem, ho aggiunto la voce pom.xml per le versioni di jar. Idealmente, vorrei evitare di utilizzare il nome utente e la password degli ospiti. Potresti farmi sapere se hai qualche suggerimento utilizzabile per un caso d'uso / prova di concetto pronto nel senario sopra?
Javaboy

Spiacente, non è chiaro cosa intendi riguardo a "caso d'uso pronto per prod / prova di concetto in senario sopra", perché qui non vedo domande sul caso d'uso. Sentiti libero di creare qualsiasi utente su RabbitMQ Broker.
Artem Bilan

La semplice soluzione è specificare localhostcosì:ConnectionFactory("localhost")
Brent Bradburn

Per UbuntuVM azure, con l' guest/guestaccount ip assegnato a azure funziona a livello globale! :(
Dev Anand Sadasivam

13

L'errore

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

può verificarsi se le credenziali che l'applicazione sta tentando di utilizzare per connettersi a RabbitMQ sono errate o mancanti.

Questo accadeva quando le credenziali RabbitMQ memorizzate nel web.configfile della mia applicazione ASP.NET avevano un valore ""per la password invece del valore effettivo della stringa della password.


1
Sì, fai attenzione agli errori di battitura. :-)
Sundar Annamalai


3

Per me la soluzione era semplice: il nome utente distingue tra maiuscole e minuscole. Anche il mancato utilizzo dei cappucci corretti porterà all'errore.


2

Nuova soluzione:

Il modulo del nodo non può gestire :correttamente una password. Anche l'URL codificato, come se funzionasse normalmente, non funziona.

Non utilizzare caratteri speciali tipici di un URL nella password!

Come uno dei seguenti: : . ? + %


Risposta originale, sbagliata:

Il messaggio di errore si lamenta chiaramente dell'utilizzo PLAIN, non significa che le critiche siano sbagliate, significa che è necessario utilizzare la consegna dei dati crittografati (TLS) invece del testo in chiaro.

La modifica amqp://della stringa di connessione in amqps://(nota il s) risolve questo problema.


2

basta aggiungere la password di accesso per connettersi a RabbitMq

 CachingConnectionFactory connectionFactory = 
         new CachingConnectionFactory("rabbit_host");

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

2

se usi il numero come password, forse dovresti provare a cambiare la password usando la stringa.

Posso accedere utilizzando deltaqin: 000000 sul sito Web, ma lo avevo durante l'esecuzione del programma. quindi modificare la password in deltaiqn. e funziona.


0

Ho realizzato esattamente quello che ha fatto @grepit.

Ma ho dovuto apportare alcune modifiche al mio codice Java:

Nel progetto Producer and Receiver ho modificato:

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

        

In questo modo, stai collegando un host specifico come l'utente che hai creato. Per me funziona!


0

Stavo affrontando questo problema a causa dello spazio vuoto alla fine della password (spring.rabbitmq.password = rabbit) nell'applicazione di avvio primaverile. Le proprietà sono state risolte rimuovendo lo spazio vuoto. Spero che questa lista di controllo aiuti qualcuno ad affrontare questo problema.


-3

impostare ConnectionFactory o il nome host della connessione su localhost

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.