Spring AMQP + RabbitMQ 3.3.5 ACCESS_REFUSED - odmówiono logowania przy użyciu mechanizmu uwierzytelniania PLAIN


94

Jestem poniżej wyjątku

org.springframework.amqp.AmqpAuthenticationException: com.rabbitmq.client.AuthenticationFailureException: ACCESS_REFUSED - odmówiono logowania przy użyciu mechanizmu uwierzytelniania PLAIN. Aby uzyskać szczegółowe informacje, zobacz plik dziennika brokera.

Konfiguracja: RabbitMQ 3.3.5 w systemie Windows

W pliku konfiguracyjnym %APPDATA%\RabbitMQ\rabbit.config wykonałem poniższą zmianę zgodnie z https://www.rabbitmq.com/access-control.html

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

Próbowałem też utworzyć użytkownika / pwd - test / test nie wydaje się działać.

Wypróbowałem kroki z tego postu.

Inne szczegóły konfiguracji są następujące:

Kontekst aplikacji Spring hostowany przez 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>

W mojej klasie kontrolera

@Autowired
RmqMessageSender rmqMessageSender;

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

W nadawcy mojej wiadomości:

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

Powyższy blok wyjątku podaje poniżej wyjątek


org.springframework.amqp.AmqpAuthenticationException: com.rabbitmq.client.AuthenticationFailureException: ACCESS_REFUSED - odmówiono logowania przy użyciu mechanizmu uwierzytelniania PLAIN. Aby uzyskać szczegółowe informacje, zobacz plik dziennika brokera.


Dziennik błędów

  =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 znajdź poniżej wpis 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>

Daj mi znać, jeśli masz jakieś przemyślenia / sugestie


Upewnij się, że konfiguracja, którą edytujesz, została załadowana.
pinepain

zaq178miami, zrobiłem kilka kroków aby upewnić się że jest załadowany. Zrestartuj usługę, uruchom ponownie komputer, a nawet ponownie zainstaluj RabbitMQ.
Javaboy

Odpowiedzi:


107

Jestem pewien, że to, co wyjaśnił tutaj Artem Bilan , może być jedną z przyczyn tego błędu:

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

ale rozwiązaniem dla mnie było to, że zalogowałem się na stronie administratora rabbitMQ ( http: // localhost: 15672 / # / users ) z domyślną nazwą użytkownika i hasłem, którym jest gość / gość, a następnie dodałem nowego użytkownika i dla tego nowego użytkownika I włączył uprawnienia dostępu do niego z wirtualnego hosta, a następnie użył nowej nazwy użytkownika i hasła zamiast domyślnego gościa i to usunęło błąd.

wprowadź opis obrazu tutaj


3
U mnie też to nie działa. Połączenie z gościem: gość jest w porządku. Połączenie z newUser: newPwd podaje ten błąd. Nie mam pojęcia, dlaczego !!
Shashank

1
Miałem ten sam problem. Idąc za tą sugestią, rozwiązał ten problem.
Christian Del Bianco

46

Aby zakończyć @ cpu-100 odpowiedzi ,

jeśli nie chcesz włączać / używać interfejsu internetowego, możesz utworzyć nowe poświadczenia za pomocą wiersza poleceń, jak poniżej i użyć go w swoim kodzie, aby połączyć się z RabbitMQ.

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

2
Dziękuję, nie mam żadnego doświadczenia z RabbitMQ, a to było szybkie rozwiązanie do uzyskania zdalnego połączenia z serwerem wywołanym z AWS AMI w celu eksperymentowania, aby sprawdzić, czy powinienem się temu przyjrzeć.
jbm

36

użytkownik „guest” może łączyć się tylko przez localhost

To prawda, ponieważ RabbitMQ 3.3.x. Dlatego należy zaktualizować bibliotekę klienta do tej samej wersji lub po prostu zaktualizować Spring AMQP do najnowszej wersji (jeśli używasz systemu zarządzania zależnościami).

Poprzednia wersja klienta była używana 127.0.0.1jako domyślna wartość hostopcji ConnectionFactory.


Cześć Artem, dodałem wpis pom.xml dla wersji jar. Najlepiej byłoby unikać używania nazwy użytkownika i hasła gościa. Czy mógłbyś dać mi znać, jeśli masz jakieś wskazówki, które mogą być przydatne w przypadku gotowego produktu do użycia / dowodu koncepcji w powyższym senario?
Javaboy

Przepraszamy, nie jest jasne, co masz na myśli w odniesieniu do „przypadku użycia gotowego do produkcji / dowodu koncepcji w powyższym senario”, ponieważ nie widzę tutaj żadnych pytań dotyczących przypadków użycia. Zapraszam do tworzenia dowolnego użytkownika na RabbitMQ Broker.
Artem Bilan

Prostym rozwiązaniem jest określenie w ten localhostsposób:ConnectionFactory("localhost")
Brent Bradburn

W przypadku Azure UbuntuVM z przypisanym guest/guestkontem IP Azure działa globalnie! :(
Dev Anand Sadasivam

14

Błąd

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

może wystąpić, jeśli poświadczenia, których aplikacja próbuje użyć do połączenia z RabbitMQ, są nieprawidłowe lub ich brakuje.

Zdarzało się to, gdy poświadczenia RabbitMQ przechowywane w web.configpliku mojej aplikacji ASP.NET miały wartość ""hasła zamiast rzeczywistej wartości ciągu hasła.


1
Tak - uważaj na literówki. :-)
Sundar Annamalai


3

Dla mnie rozwiązanie było proste: w nazwie użytkownika rozróżniana jest wielkość liter. Niezastosowanie odpowiednich kapsli również prowadzi do błędu.


2

Nowe rozwiązanie:

Moduł węzła nie może :poprawnie obsługiwać hasła. Nawet zakodowany adres URL, tak jakby działał normalnie, nie działa.

Nie używaj w haśle typowych znaków specjalnych z adresu URL!

Jak jeden z następujących: : . ? + %


Oryginalna, zła odpowiedź:

Komunikat o błędzie wyraźnie narzeka na używanie PLAIN, nie oznacza to, że dane uwierzytelniające są nieprawidłowe, oznacza to, że musisz użyć szyfrowanego dostarczania danych (TLS) zamiast zwykłego tekstu.

Zmiana amqp://ciągu połączenia na amqps://(zwróć uwagę na s) rozwiązuje ten problem.


2

po prostu dodaj hasło logowania, aby połączyć się z RabbitMq

 CachingConnectionFactory connectionFactory = 
         new CachingConnectionFactory("rabbit_host");

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

2

jeśli używasz numeru jako hasła, być może powinieneś spróbować zmienić hasło za pomocą ciągu.

Mogę zalogować się za pomocą deltaqin: 000000 na stronie, ale miałem to podczas uruchamiania programu. następnie zmień hasło na deltaiqn. i to działa.


0

Zrobiłem dokładnie to, co zrobił @grepit.

Ale musiałem wprowadzić pewne zmiany w moim kodzie Java:

W projekcie Producer and Receiver zmieniłem:

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

        

W ten sposób łączysz się z określonym hostem jako utworzony użytkownik. Mi to pasuje!


0

Miałem do czynienia z tym problemem z powodu pustego miejsca na końcu hasła (spring.rabbitmq.password = rabbit) w aplikacji rozruchowej wiosny. Właściwość została rozwiązana po usunięciu pustego miejsca. Mam nadzieję, że ta lista kontrolna pomoże komuś, kto boryka się z tym problemem.


-4

ustaw ConnectionFactory lub Connection hostname na localhost

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.