Spring AMQP + RabbitMQ 3.3.5 ACCESS_REFUSED-使用身份验证机制PLAIN拒绝登录


92

我在例外之下

org.springframework.amqp.AmqpAuthenticationException:com.rabbitmq.client.AuthenticationFailureException:ACCESS_REFUSED-使用身份验证机制PLAIN拒绝登录。有关详细信息,请参阅代理日志文件。

在Windows上配置:RabbitMQ 3.3.5

在Config文件中,%APPDATA%\RabbitMQ\rabbit.config 我按照https://www.rabbitmq.com/access-control.html完成了以下更改

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

我还尝试创建一个用户/密码-测试/测试似乎无法使其正常工作。

尝试了这篇文章的步骤。

其他配置详细信息如下:

Tomcat托管的Spring Application Context:

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

zaq178miami,我已完成一些步骤以确保已加载。重新启动服务,重新启动机器,甚至重新安装RabbitMQ。
Javaboy

Answers:


104

我确定Artem Bilan在这里所做的解释可能是导致此错误的原因之一:

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

但是对我来说,解决方案是我使用默认用户名和密码guest / guest 登录到rabbitMQ管理页面(http:// localhost:15672 /#/ users),然后添加了一个新用户,并为此我添加了一个新用户启用从虚拟主机访问它的权限,然后使用新的用户名和密码代替默认的guest虚拟机,从而清除了错误。

在此处输入图片说明


2
它对我也不起作用。与guest:guest的连接很好。与newUser:newPwd的连接给出此错误。不知道为什么!
沙申克

1
我有同样的问题。按照这个建议,它解决了这个问题。
Christian Del Bianco

43

要完成@ cpu-100 回答

如果您不想启用/使用Web界面,则可以使用如下所示的命令行创建新的凭据,并在代码中使用它来连接RabbitMQ。

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

1
谢谢,我对RabbitMQ的使用经验为零,这是一种快速解决方案,可实现从AWS AMI带来的服务器远程连接,以进行实验以查看是否应进一步研究。
jbm

36

用户“来宾”只能通过本地主机连接

从RabbitMQ 3.3.x开始就是如此。因此,您应该升级到客户端库的相同版本,或者只是将Spring AMQP升级到最新版本(如果使用依赖项代理系统)。

以前的客户端版本中使用127.0.0.1作为默认值host的选项ConnectionFactory


嗨,Artem,我为jar版本添加了pom.xml条目。理想情况下,我想避免使用来宾用户名和密码。您能否让我知道您是否有任何适用于上述senario的产品就绪用例/概念证明的指针?
Javaboy

抱歉,您不清楚senario中的“准备生产的用例/概念证明”是什么意思,因为我在这里看不到任何用例问题。随时在RabbitMQ Broker上创建任何用户。
Artem Bilan 2014年

简单的解决方案是这样指定localhostConnectionFactory("localhost")
Brent Bradburn

对于azure UbuntuVM,使用azure分配的IP guest/guest帐户在全球范围内都可以使用!:(
Dev Anand Sadasivam

13

错误

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

如果您的应用程序试图用来连接RabbitMQ的凭据不正确或丢失,则会发生这种情况。

当存储在ASP.NET应用程序web.config文件中的RabbitMQ凭证""的密码值为而不是实际的密码字符串值时,就会发生这种情况。


1
是的-小心错别字。:-)
Sundar Annamalai



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)末尾有空白,我遇到了这个问题。解决了删除空白的问题。希望这份清单能帮助一些面对这一问题的人。


-3

将ConnectionFactory或Connection主机名设置为localhost

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.