参考资料:https://www.rabbitmq.com/access-control.html

A. 核心概念

  • Virtual Host:虚拟主机为 RabbitMQ 中的资源提供了逻辑分组与隔离
  • 资源:资源是虚拟主机中的实体,例如队列和交换机。不同虚拟主机中的同名实体是不同的资源

## B. Rabbit 访问控制基本流程
当客户端尝试建立到 RabbitMQ 的连接时,必须指定虚拟主机和用户密码。如果用户密码正确,同时该用户在该虚拟主机配置过任何权限,则可以建立连接,否则拒绝连接。

连接建立后,任何对该虚拟主机中资源的操作都会触发权限检查。

C. 权限

RabbitMQ 中每一个资源都对应了三种权限类型:

  • configure: 创建与销毁资源
  • write:向资源注入消息
  • read:从资源获取消息

用户是否拥有某个资源的某种权限类型可以看成是一个最小粒度的权限(这不是官方文档原意,只是个人理解)。

任何对资源的操作,RabbitMQ 都会检查该用户是否有合适的权限。下表列出所有对资源的操作分别需要什么样的权限:

AMQP 0-9-1 Operation configure write read
exchange.declare (passive=false) exchange
exchange.declare (passive=true)
exchange.declare (with AE) exchange exchange (AE) exchange
exchange.delete exchange
queue.declare (passive=false) queue
queue.declare (passive=true)
queue.declare (with DLX) queue exchange (DLX) queue
queue.delete queue
exchange.bind exchange (destination) exchange (source)
exchange.unbind exchange (destination) exchange (source)
queue.bind queue exchange
queue.unbind queue exchange
basic.publish exchange
basic.get queue
basic.consume queue
queue.purge queue

例如第5行的 queue.declare (passive=false) 操作,即之前我们调用的 senderChannel.queueDeclare("test", true, false, false, null);,它要求用户对 test 队列(资源)有 configure 操作权限。如果没有该权限,申明队列的请求会抛出异常,哪怕该队列实际已经存在都不行。

而根据第6行,哪怕用户对 test 队列没有任何权限,也可以通过 senderChannel.queueDeclarePassive("test"); 申明该队列。(当然,就算不申明,该队列也是可以直接使用的。passive 方式的申明只是用来判断队列是否已经存在)

D. 设置权限

https://www.rabbitmq.com/man/rabbitmqctl.1.man.html#Access control

通过 rabbitmqctl 的 set_permissions 命令可以为用户设置权限,命令格式为:

set_permissions [-p vhost] {user} {conf} {write} {read}

  • vhost:虚拟主机的名字,默认的虚拟主机是 "/"。
  • user:用户名
  • conf:一个正则表达式,用户对符合该正则表达式的所有资源拥有 configure 操作的权限
  • write:一个正则表达式,用户对符合该正则表达式的所有资源拥有 write 操作的权限
  • read:一个正则表达式,用户对符合该正则表达式的所有资源拥有 read 操作的权限

实例:`rabbitmqctl set_permissions -p /myvhost test "^test-.*" ".*" ".*"` 为 test 用户在 /myvhost 虚拟主机中设置以下权限:对 test- 开头的资源赋予 configure 权限,对所有资源赋予 write 和 read 权限。

显然,一个用户对一个虚拟主机只能设置一条权限配置,这对正则表达式的定义提出了要求,也对资源命名规则提出了要求。

E. 实战

本文涉及的所有功能都可以通过管理插件在管理页面操作。

我们将创建 test 用户,使其可以访问 /test 虚拟主机,同时对 /test 虚拟主机中名字为 hello 的资源具有 configure 权限,所有资源具有 write 和 read 权限:

  • 在管理页面 Admin > Users 页创建用户 test
  • 在管理页面 Admin > Virtual Hosts 页创建虚拟主机 /test
  • 在虚拟主机列表中点击 /test 虚拟主机,进入详细信息页面
  • 在 Permissions 区段中选择 test 用户,将 Configure regexp 设置为 hello,其它不变,点击 Set permission 按钮

**gordon.study.rabbitmq.accesscontrol.TestAccessControl.java**

public class TestAccessControl {

    private static final String QUEUE_NAME = "test";

    public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setVirtualHost("/test");
factory.setUsername("test");
factory.setPassword("test123");
Connection connection = factory.newConnection();
Channel senderChannel = connection.createChannel();
// senderChannel.queueDeclare(QUEUE_NAME, true, false, false, null); // throw Exception
senderChannel.queueDeclarePassive(QUEUE_NAME);
senderChannel.basicPublish("", QUEUE_NAME, null, "test".getBytes("UTF-8"));
}
}

RabbitMQ入门_15_访问控制的更多相关文章

  1. RabbitMQ入门教程(一):安装和常用命令

    原文:RabbitMQ入门教程(一):安装和常用命令 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn ...

  2. 2.RABBITMQ 入门 - WINDOWS - 生产和消费消息 一个完整案例

    关于安装和配置,见上一篇 1.RABBITMQ 入门 - WINDOWS - 获取,安装,配置 公司有需求,要求使用winform开发这个东西(消息中间件),另外还要求开发一个日志中间件,但是也是要求 ...

  3. RabbitMQ入门-从HelloWorld开始

    从读者的反馈谈RabbitMQ 昨天发完<RabbitMQ入门-初识RabbitMQ>,我陆陆续续收到一些反馈.鉴于部分读者希望结合实例来讲 期待下篇详细,最好结合案例.谢谢! 哪都好,唯 ...

  4. RabbitMQ入门-高效的Work模式

    扛不住的Hello World模式 上篇<RabbitMQ入门-从HelloWorld开始>介绍了RabbitMQ中最基本的Hello World模型.正如其名,Hello World模型 ...

  5. RabbitMQ入门-消息订阅模式

    消息派发 上篇<RabbitMQ入门-消息派发那些事儿>发布之后,收了不少反馈,其中问的最多的还是有关消息确认以及超时等场景的处理. 楼主,有遇到消费者后台进程不在,但consumer连接 ...

  6. RabbitMQ入门-Topic模式

    上篇<RabbitMQ入门-Routing直连模式>我们介绍了可以定向发送消息,并可以根据自定义规则派发消息.看起来,这个Routing模式已经算灵活的了,但是,这还不够,我们还有更加多样 ...

  7. RabbitMQ入门与使用篇

    介绍 RabbitMQ是一个由erlang开发的基于AMQP(Advanced Message Queue)协议的开源实现.用于在分布式系统中存储转发消息,在易用性.扩展性.高可用性等方面都非常的优秀 ...

  8. [转]RabbitMQ入门教程(概念,应用场景,安装,使用)

    原文地址:https://www.jianshu.com/p/dae5bbed39b1 RabbitMQ 简介 RabbitMQ是一个在AMQP(Advanced Message Queuing Pr ...

  9. RabbitMQ 入门指南——安装

    RabbitMQ好文 Rabbitmq Java Client Api详解 tohxyblog-博客园-rabbitMQ教程系列 robertohuang-CSDN-rabbitMQ教程系列 Rabb ...

随机推荐

  1. mysql查询表基本操作

    数据库表的创建create table <表名>( <列名> <数据类型及长度> [not null], <列名> <数据类型及长度>, . ...

  2. redis桌面管理工具 redis-desktop-manager使用指南(转)

    版权声明:转自 http://blog.csdn.net/li396864285/article/details/54629898     概要:一款好用的Redis桌面管理工具,支持命令控制台操作, ...

  3. 如何提取app软件的apk格式中的字体?

    1.下载apk格式的指定app软件: 2.将apk格式的文件名更改为后缀名为zip格式: 3.用winrar解压软件解压,然后就找到其中的ttf格式的字体文件. 举例说明,我想找到airbnb的app ...

  4. 如何发布Maven依赖到中央仓库

    平时我们都是从Maven中央仓库下载依赖,如果我们想发布我们自己写的Maven依赖到中央仓库供别人下载使用应该怎么办?这里以上传自己写的simian-maven-plugin(https://gith ...

  5. Linux基础命令---ziinfo

    zipinfo 在不解压的情况下,获取zip压缩文件的的详细信息.zipinfo列出了ZIP档案中有关文件的技术信息,最常见的是在MS-DOS系统上.这些信息包括文件访问权限.加密状态.压缩类型.版本 ...

  6. Linux基础命令---e2image

    e2image e2Image程序将位于设备上的ext2.ext3或ext4文件系统元数据保存到由图像文件指定的文件中.通过对这些程序使用-i选项,image文件可以由dupe2fs和调试器来检查.这 ...

  7. OAuth : open Authorization 开发授权

    OAuth : open Authorization 开发授权 用户访问慕课网,慕课网请求OAuth登陆页面,用户输入QQ号码和密码,这个页面的域名不属于慕课网是属于QQ的,随后把结果给慕课网,这个结 ...

  8. Ubuntu系统下Jenkins的本地构建基本方法

    上一篇文章介绍了,jenkins的安装和系统配置之后,配置登录成功后,就可以新建jenkins构建项目,用于自动化构建. 1.项目名称和项目描述 点击左上角的 新建任务,输入项目名称,选择 构建一个自 ...

  9. Linux vmstat命令实际操作介绍

    vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存.进程.CPU活动进行监控.它能够对系统的整体情况进行统计,无法对某个进程进行深入分析. ...

  10. keepalived+MySQL高可用集群

    基于keepalived搭建MySQL的高可用集群   MySQL的高可用方案一般有如下几种: keepalived+双主,MHA,MMM,Heartbeat+DRBD,PXC,Galera Clus ...