Spring AMQP + RabbitMQ 3.3.5 ACCESS_REFUSED - La connexion a été refusée à l'aide du mécanisme d'authentification PLAIN


92

Je suis en dessous de l'exception

org.springframework.amqp.AmqpAuthenticationException: com.rabbitmq.client.AuthenticationFailureException: ACCESS_REFUSED - La connexion a été refusée à l'aide du mécanisme d'authentification PLAIN. Pour plus de détails, consultez le fichier journal du courtier.

Configuration: RabbitMQ 3.3.5 sous Windows

Sur le fichier de configuration dans %APPDATA%\RabbitMQ\rabbit.config j'ai fait ci-dessous le changement selon https://www.rabbitmq.com/access-control.html

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

J'ai également essayé de créer un utilisateur / pwd - test / test ne semble pas le faire fonctionner.

J'ai essayé les étapes de ce post.

Les autres détails de configuration sont les suivants:

Contexte d'application Spring hébergé par 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>

Dans ma classe de contrôleur

@Autowired
RmqMessageSender rmqMessageSender;

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

Dans l'expéditeur de mon message:

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

Au-dessus de l'exception Le bloc donne ci-dessous l'exception


org.springframework.amqp.AmqpAuthenticationException: com.rabbitmq.client.AuthenticationFailureException: ACCESS_REFUSED - La connexion a été refusée à l'aide du mécanisme d'authentification PLAIN. Pour plus de détails, consultez le fichier journal du courtier.


Journal des erreurs

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

Veuillez trouver ci-dessous l'entrée 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>

S'il vous plaît laissez-moi savoir si vous avez des idées / suggestions


Assurez-vous que la configuration que vous modifiez est chargée.
pinepain

zaq178miami, j'ai fait quelques étapes pour m'assurer qu'il est chargé. Redémarrez le service, redémarrez la machine et même réinstallez le RabbitMQ.
Javaboy

Réponses:


104

Je suis sûr que ce qu'Artem Bilan a expliqué ici pourrait être l'une des raisons de cette erreur:

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

mais la solution pour moi était que je me suis connecté à la page d'administration de rabbitMQ ( http: // localhost: 15672 / # / users ) avec le nom d'utilisateur et le mot de passe par défaut qui est guest / guest puis j'ai ajouté un nouvel utilisateur et pour ce nouvel utilisateur je a activé l'autorisation d'y accéder à partir de l'hôte virtuel, puis a utilisé le nouveau nom d'utilisateur et le mot de passe au lieu de l'invité par défaut, ce qui a effacé l'erreur.

entrez la description de l'image ici


2
Cela ne fonctionne pas non plus pour moi. Connexion avec l'invité: l'invité va bien. Connexion avec newUser: newPwd donne cette erreur. Je ne sais pas pourquoi !!
Shashank

1
J'ai eu le même problème. Suite à cette suggestion, il a résolu ce problème.
Christian Del Bianco

43

Pour répondre à @ cpu-100 ,

au cas où vous ne voudriez pas activer / utiliser l'interface Web, vous pouvez créer de nouvelles informations d'identification en utilisant la ligne de commande comme ci-dessous et l'utiliser dans votre code pour vous connecter à RabbitMQ.

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

1
Merci, je n'ai aucune expérience avec RabbitMQ, et c'était une solution rapide pour obtenir une connexion à distance à un serveur provenant d'une AMI AWS pour expérimenter pour voir si je devais l'examiner plus en détail.
jbm

36

l'utilisateur 'invité' ne peut se connecter que via localhost

C'est vrai depuis RabbitMQ 3.3.x. Par conséquent, vous devez mettre à niveau vers la même version de la bibliothèque cliente, ou simplement mettre à niveau Spring AMQP vers la dernière version (si vous utilisez le système de gestion des dépendances).

Version précédente du client utilisée 127.0.0.1comme valeur par défaut pour l' hostoption de ConnectionFactory.


Salut Artem, j'ai ajouté l'entrée pom.xml pour les versions de jar. Idéalement, je voudrais éviter d'utiliser le nom d'utilisateur et le mot de passe d'invité. Pourriez-vous s'il vous plaît me faire savoir si vous avez des pointeurs utilisables pour un cas d'utilisation / preuve de concept prêt pour la production dans le senario ci-dessus?
Javaboy

Désolé, ce que vous entendez par `` cas d'utilisation prêt pour la production / preuve de concept dans le senario ci-dessus '' n'est pas clair, car je ne vois aucune question de cas d'utilisation ici. N'hésitez pas à créer n'importe quel utilisateur sur le courtier RabbitMQ.
Artem Bilan

La solution simple est de préciser localhostcomme ceci:ConnectionFactory("localhost")
Brent Bradburn

Pour Azure UbuntuVM, avec le guest/guestcompte IP attribué à Azure fonctionne dans le monde entier! :(
Dev Anand Sadasivam

13

L'erreur

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

peut se produire si les informations d'identification que votre application tente d'utiliser pour se connecter à RabbitMQ sont incorrectes ou manquantes.

Cela s'est produit lorsque les informations d'identification RabbitMQ stockées dans le web.configfichier de mon application ASP.NET avaient une valeur de ""pour le mot de passe au lieu de la valeur de la chaîne de mot de passe réelle.


1
Oui - Attention aux fautes de frappe. :-)
Sundar Annamalai


3

Pour moi, la solution était simple: le nom d'utilisateur est sensible à la casse. Ne pas utiliser les bouchons appropriés entraînera également l'erreur.


2

Nouvelle solution:

Le module de nœud ne peut pas gérer :correctement un mot de passe. Même url encodée, comme cela fonctionnerait normalement, cela ne fonctionne pas.

N'utilisez pas de caractères spéciaux typiques d'une URL dans le mot de passe!

Comme l'un des suivants: : . ? + %


Original, mauvaise réponse:

Le message d'erreur se plaint clairement de l'utilisation PLAIN, cela ne signifie pas que les informations d'identification sont fausses, cela signifie que vous devez utiliser la livraison de données cryptées (TLS) au lieu du texte brut.

Changer amqp://la chaîne de connexion en amqps://(notez le s) résout ce problème.


2

ajoutez simplement le mot de passe de connexion pour vous connecter à RabbitMq

 CachingConnectionFactory connectionFactory = 
         new CachingConnectionFactory("rabbit_host");

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

2

si vous utilisez le numéro comme mot de passe, vous devriez peut-être essayer de changer votre mot de passe en utilisant une chaîne.

Je peux me connecter en utilisant deltaqin: 000000 sur le site Web, mais je l'ai eu lors de l'exécution du programme. puis changez le mot de passe en deltaiqn. et il fonctionne.


0

J'ai fait exactement ce que @grepit a fait.

Mais j'ai dû faire quelques changements dans mon code Java:

Dans le projet Producer and Receiver, j'ai modifié:

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

        

Ce faisant, vous connectez un hôte spécifique en tant qu'utilisateur que vous avez créé. Ça marche pour moi!


0

J'étais confronté à ce problème en raison d'un espace vide à la fin du mot de passe (spring.rabbitmq.password = rabbit) dans spring boot application.properties a été résolu en supprimant l'espace vide. J'espère que cette liste de contrôle aidera quelqu'un à faire face à ce problème.


-3

définir le nom d'hôte ConnectionFactory ou Connection sur localhost

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.