Spring连接RabbitMQ报ACCESS_REFUSED队列访问被拒问题咨询
Spring对接RabbitMQ创建队列报403访问拒绝问题排查
问题相关配置
项目application.properties配置如下:
spring.rabbitmq.addresses=xxxxxxx.xxxx.dev.xxx:5672 spring.rabbitmq.username=people-consumer spring.rabbitmq.password=******* peopleevents.vhost=PEOPLE peopleevents.queue=qu-people-cores-update peopleevents.exchange=ex-people-updates peopleevents.routingkey=ONLINE.UPDATE.PERSONF.PERSONF;
服务启动核心报错日志:
2022-06-27 14:06:43.958 INFO 13668 --- [ main] o.s.a.r.c.CachingConnectionFactory : Created new connection: connectionFactory#63538bb4:0/SimpleConnection@8b13d91 [delegate=amqp://people-consumer@107.2.164.186:5672/PEOPLE, localPort= 59226] 2022-06-27 14:06:44.236 ERROR 13668 --- [.2.164.186:5672] o.s.a.r.c.CachingConnectionFactory : Channel shutdown: channel error; protocol method: #method<channel.close>(reply-code=403, reply-text=ACCESS_REFUSED - access to queue 'qu-people-cores-update' in vhost 'PEOPLE' refused for user 'people-consumer', class-id=50, method-id=10)
问题根因
报错核心是用户people-consumer在PEOPLE vhost下的权限不足,具体触发场景分两类:
- Spring AMQP默认启动时会通过
RabbitAdmin自动声明配置类里定义的队列、交换机、绑定关系,执行declare操作需要用户持有对应资源的配置(configure)权限,当前账号没有被授予该队列、交换机的配置权限,无法执行资源声明操作,直接触发403。 - 若队列已经由其他账号提前创建,当前
people-consumer账号没有被授予该队列的读、写权限,无论是声明检查还是后续发起消费请求,都会被服务端拒绝。 - 额外配置隐患:当前配置只自定义了
peopleevents.vhost参数,没有配置Spring RabbitMQ官方标准的vhost参数,虽然日志显示已经连接到PEOPLE vhost,但存在自定义配置未被Rabbit客户端识别导致的路由异常风险。
解决方案
按以下顺序排查修复:
- 登录RabbitMQ管理控制台,进入Admin模块找到
people-consumer账号,配置该账号在PEOPLEvhost下的权限正则:- configure权限:配置正则匹配需要声明的队列、交换机名称,比如
^qu-people-.*|^ex-people-.*,允许该账号操作业务前缀的所有资源 - write权限:配置正则匹配需要发送消息的资源,消费场景可和configure权限保持一致
- read权限:配置正则匹配需要消费的队列,比如
^qu-people-.*
权限保存后重启服务即可验证。
- configure权限:配置正则匹配需要声明的队列、交换机名称,比如
- 如果团队规范要求禁止业务服务自动创建/声明队列,所有资源由运维提前统一创建,直接在配置文件中关闭自动声明开关,避免启动时发起declare权限校验:
注意开启该配置前必须确认队列、交换机、绑定关系已经提前创建完成,且账号已经持有对应队列的读写权限,否则后续消费会报错。spring.rabbitmq.dynamic=false - 补全Spring官方标准的vhost配置,消除自定义vhost参数的识别风险:
spring.rabbitmq.virtual-host=PEOPLE
内容的提问来源于stack exchange,提问作者DiegoMG
相关产品推荐
相关产品推荐

