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

时间:2014-11-07 23:42:53

标签: rabbitmq spring-integration spring-amqp

我正处于异常

之下
  

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

配置:Windows上的RabbitMQ 3.3.5

%APPDATA%\RabbitMQ\rabbit.config的配置文件中 我根据https://www.rabbitmq.com/access-control.html

完成了以下更改
[{rabbit, [{loopback_users, []}]}].

我也试过创建一个用户/ pwd - 测试/测试似乎没有使它工作。

尝试从this发布的步骤。

其他配置详情如下:

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

以上异常Block给出以下异常


  

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>

如果您有任何想法/建议,请告诉我

13 个答案:

答案 0 :(得分:88)

我确信Artem Bilan解释here可能是导致此错误的原因之一:

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

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

enter image description here

答案 1 :(得分:32)

  

用户'来宾'只能通过localhost连接

自RabbitMQ 3.3.x以来,这是真的。因此,您应该升级到客户端库的相同版本,或者只是将Spring AMQP升级到最新版本(如果使用依赖管理系统)。

以前版本的客户端使用127.0.0.1作为host的{​​{1}}选项的默认值。

答案 2 :(得分:32)

完成@ cpu-100 answer

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

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

答案 3 :(得分:6)

错误

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

如果您的应用程序尝试用于连接RabbitMQ的凭据不正确或丢失,则会出现

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

答案 4 :(得分:4)

要允许访客远程访问,请写下

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

到这里

c:\Users\[your user name]\AppData\Roaming\RabbitMQ\rabbitmq.config

然后重启rabbitmq windows服务(来源https://www.rabbitmq.com/access-control.html

答案 5 :(得分:2)

只需添加登录密码即可连接到RabbitMq

 CachingConnectionFactory connectionFactory = 
         new CachingConnectionFactory("rabbit_host");

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

答案 6 :(得分:2)

如果使用数字作为密码,也许您应该尝试使用字符串更改密码。

我可以在网站上使用deltaqin:000000登录,但在运行该程序时已登录。然后将密码更改为deltaiqn。而且有效。

答案 7 :(得分:1)

新解决方案:

节点模块无法正确处理密码中的:。即使是url编码,就像它会正常工作一样,它也不起作用。

请勿在密码中使用网址中的典型特殊字符!

如下所示:: . ? + %

原文,错误答案:

错误消息明显抱怨使用PLAIN,这并不意味着凭证是错误的,这意味着您必须使用加密数据传送(TLS)而不是明文。

将连接字符串中的amqp://更改为amqps://(请注意s)解决此问题。

答案 8 :(得分:0)

对我来说,解决方案很简单:用户名区分大小写。不正确使用大写字母也会导致错误。

答案 9 :(得分:0)

我所做的正是@grepit所做的。

但是我必须对Java代码进行一些更改:

在生产者和接收者项目中,我进行了更改:

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

        

这样做,您正在以创建的用户身份连接特定的主机。 它对我有用!

答案 10 :(得分:0)

由于弹簧启动应用程序中密码(spring.rabbitmq.password = rabbit)末尾有空白,我面临着这个问题。解决了删除空白的问题。希望这份清单能帮助面对这一问题的人。

答案 11 :(得分:0)

在 localhost 上,默认使用 'amqp://guest:guest@localhost:5672'

所以在远程或托管的 RabbitMQ 上。假设您拥有以下凭据

用户名:niceboy 密码:notnice 主持人:goxha.com 端口:1597

那么你应该传递的uri是

amqp://niceboy:notnice@goxha.com:1597

遵循模板 amqp://user:pass@host:10000

如果你有一个虚拟主机,你可以做 amqp://user:pass@host:10000/vhost 其中尾随的虚拟主机将是你的虚拟主机的名称

答案 12 :(得分:-3)

将ConnectionFactory或Connection主机名设置为localhost