Spring AMQP + RabbitMQ 3.3.5 ACCESS_REFUSED - в входе было отказано с использованием механизма аутентификации PLAIN


94

Я получаю исключение ниже

org.springframework.amqp.AmqpAuthenticationException: com.rabbitmq.client.AuthenticationFailureException: ACCESS_REFUSED - в входе было отказано с использованием механизма аутентификации PLAIN. Подробнее см. Файл журнала брокера.

Конфигурация: RabbitMQ 3.3.5 для windows

В файле конфигурации %APPDATA%\RabbitMQ\rabbit.config я сделал следующие изменения в соответствии с https://www.rabbitmq.com/access-control.html

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

Я также попытался создать пользователя / pwd - test / test, похоже, не работает.

Пробовал шаги из этого сообщения.

Прочие сведения о конфигурации приведены ниже:

Tomcat разместил контекст приложения Spring:

<!-- 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>

В моем классе контроллера

@Autowired
RmqMessageSender rmqMessageSender;

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

В моем сообщении отправитель:

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

Блок исключений выше дает исключение ниже


org.springframework.amqp.AmqpAuthenticationException: com.rabbitmq.client.AuthenticationFailureException: ACCESS_REFUSED - в входе было отказано с использованием механизма аутентификации PLAIN. Подробнее см. Файл журнала брокера.


Журнал ошибок

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

Пожалуйста, найдите ниже запись 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>

Пожалуйста, дайте мне знать, если у вас есть какие-либо мысли / предложения


Убедитесь, что конфигурация, которую вы редактируете, загружена.
pinepain

zaq178miami, я сделал несколько шагов, чтобы убедиться, что он загружен. Перезапустите службу, перезагрузите компьютер и даже переустановите RabbitMQ.
Javaboy

Ответы:


107

Я уверен , что Артем Билан объяснил здесь может быть одна из причин этой ошибки:

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

но решение для меня заключалось в том, что я вошел на страницу администратора rabbitMQ ( http: // localhost: 15672 / # / users ) с именем пользователя и паролем по умолчанию, который является гостем / гостем, затем добавил нового пользователя и для этого нового пользователя я включил разрешение на доступ к нему с виртуального хоста, а затем использовал новое имя пользователя и пароль вместо гостя по умолчанию, и это устранило ошибку.

введите описание изображения здесь


3
У меня тоже не работает. Связь с гостем: гость в порядке. Соединение с newUser: newPwd выдает эту ошибку. Понятия не имею, почему !!
Shashank

1
У меня такая же проблема. Следуя этому предложению, он решил эту проблему.
Кристиан Дель Бьянко,

46

Чтобы завершить ответ @ cpu-100 ,

если вы не хотите включать / использовать веб-интерфейс, вы можете создать новые учетные данные с помощью командной строки, как показано ниже, и использовать их в своем коде для подключения к RabbitMQ.

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

2
Спасибо, у меня нет опыта работы с RabbitMQ, и это было быстрое решение для получения удаленного подключения к серверу, созданного из AWS AMI, для экспериментов, чтобы посмотреть, стоит ли мне изучить это дополнительно.
jbm

36

пользователь 'гость' может подключаться только через localhost

Это верно, начиная с RabbitMQ 3.3.x. Следовательно, вам следует обновить клиентскую библиотеку до той же версии или просто обновить Spring AMQP до последней версии (если вы используете систему управления зависимостями).

Предыдущая версия клиента использовалась 127.0.0.1как значение по умолчанию для hostопции ConnectionFactory.


Привет, Артем, я добавил запись pom.xml для версий jar. В идеале я бы не хотел использовать гостевое имя пользователя и пароль. Не могли бы вы сообщить мне, есть ли у вас какие-либо указатели, которые можно использовать для готового варианта использования / подтверждения концепции в приведенном выше сценарии?
Javaboy

К сожалению, непонятно, что вы имеете в виду, говоря о «Prod ready Use Case / Proof of concept in above senario», потому что я не вижу здесь вопросов о вариантах использования. Не стесняйтесь создавать любого пользователя на RabbitMQ Broker.
Артем Билан

Простое решение - указать localhostтак:ConnectionFactory("localhost")
Брент Брэдберн

Для Azure UbuntuVM с назначенной лазурной guest/guestучетной записью ip работает глобально! :(
Дев Ананд Садасивам

14

Ошибка

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

может возникнуть, если учетные данные, которые ваше приложение пытается использовать для подключения к RabbitMQ, неверны или отсутствуют.

У меня это произошло, когда учетные данные RabbitMQ, хранящиеся в файле моего приложения ASP.NET, web.configимели значение ""пароля вместо фактического значения строки пароля.


1
Да - остерегайтесь опечаток. :-)
Sundar Annamalai


3

Для меня решение было простым: имя пользователя чувствительно к регистру. Неиспользование правильных колпачков также приведет к ошибке.


2

Новое решение:

Модуль узла не может :правильно обрабатывать пароль. Даже URL-адрес закодирован, вроде бы нормально работает, не работает.

Не используйте в пароле типичные специальные символы из URL!

Как одно из следующих: : . ? + %


Оригинальный, неправильный ответ:

Сообщение об ошибке явно жалуется на использование PLAIN, это не означает, что учетные данные неверны, это означает, что вы должны использовать зашифрованную доставку данных (TLS) вместо открытого текста.

Изменение amqp://строки подключения на amqps://(обратите внимание s) решает эту проблему.


2

просто добавьте пароль для входа в RabbitMq

 CachingConnectionFactory connectionFactory = 
         new CachingConnectionFactory("rabbit_host");

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

2

если вы используете номер в качестве пароля, возможно, вам стоит попробовать изменить пароль, используя строку.

Я могу войти в систему с помощью deltaqin: 000000 на веб-сайте, но это было во время работы программы. затем измените пароль на deltaiqn. и это работает.


0

Я сделал именно то, что сделал @grepit.

Но мне пришлось внести некоторые изменения в свой Java-код:

В проекте «Продюсер и приемник» я изменил:

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

        

При этом вы подключаете определенный хост в качестве пользователя, которого вы создали. Меня устраивает!


0

Я столкнулся с этой проблемой из-за пустого места в конце пароля (spring.rabbitmq.password = rabbit) в приложении весенней загрузки. Свойства были разрешены при удалении пустого пространства. Надеюсь, этот контрольный список поможет кому-нибудь столкнуться с этой проблемой.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.