RabbitMQ权限控制原理
我们在使用MQ搭建系统的时候,经常要开放队列给外接系统访问。外接系统的稳定性是不可控的。为了防止外接系统不稳定导致误操作破坏了MQ的配置或数据,需要对MQ做比较精细的权限控制。
我的需求是这样的:
我有一个数据查询服务,并且通过MQ推送数据变动消息。对接MQ的每个系统都会有自己一个独立的队列来读取消息。所有消息通过一个扇形交换机广播到所有队列。我需要这个交换机和所有队列都由管理员统一创建好。而其他系统使用的用户,均没有创建交换机和队列的权限。数据查询服务只拥有推送消息的权限,其他对接MQ的系统只拥有从自己队列读取消息的权限。
我们使用的MQ是RabbitMQ。我在网上搜了一下,大部分讲的是用户角色配置。对于MQ的资源授权管理讲的比较少。以下内容将主要讲解RabbitMQ权限控制的基本概念和模型。理解了这些基本概念后,应该可以愉快地使用RabbitMQ管理界面进行授权操作。如果你们只有命令行可用,也能很轻松地找到相应的命令。
RabbitMQ初始化
RabbitMQ初次启动时,初始创建这两个东西:
- 一个名称为
/的virtual host - guest用户,拥有
/的全部权限,只能localhost访问
RabbitMQ授权模型
第一级控权单位是virtual host,virtual host下面第二级的控权单位是resource(包含exchange和queue)。两个相同名称的resource如果分属不同的virtual host,则算是不同的resource。
什么是virtual host:
RabbitMQ is multi-tenant system: connections, exchanges, queues, bindings, user permissions, policies and some other things belong to virtual hosts, logical groups of entities.
就是说RabbitMQ是多租户系统,简单理解就是把多virtual host当做多个MQ系统来用就好了……
当用户访问MQ时,首先触发第一级控权,判断用户是否有访问该virtual host的权限。
若可访问,则进行第二级控权,判断用户是否具有操作(operation)所请求的资源的权限。
RabbitMQ定义了操作(operation)有这么三种:
- configure:主要对应创建exchange和queue操作;
- write:write主要对应绑定和推送消息操作;
- read:read主要对应读取消息操作。
后面有个表格列出了具体的对应关系。
当管理员对一个用户进行授权时,要配置两个元素:
- 允许什么操作,即configure、write、read三种operation;
- 操作什么resource。用户是否拥有某资源的权限,通过对该资源的名称与授权时配置的正则进行匹配来判断。

下面这张表详细描述了operation、resource和用户可执行的操作的关系:

例子:
- 如果要给用户授权可以往exchange
foo推消息,则我们找到basic.publish这行,格子不是空的只有write这列,所以我们需要给用户授权一个write权限,其正则可以匹配字符串foo(比如说^foo$,或者.*等)。 - 如果要给用户授权只能从queue
bar读取消息,则需要给用户授权一个read权限,其正则可以匹配字符串bar。
进一步了解
本文内容基本来自官网手册,如果需要更详细的说明——比如说topic的授权,可以直接看手册。很多时候,当你刚接触一个新工具时,比起在互联网上瞎逛,直接阅读官方手册效率会高很多。虽然手册比较冗长,而且大部分只有纯英文,但毕竟最远的路,就是最快的捷径。
RabbitMQ权限控制原理的更多相关文章
- RabbitMQ权限
RabbitMQ 引言 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消息队 ...
- rabbitMQ权限相关命令
权限相关命令为: (1) 设置用户权限 rabbitmqctl set_permissions -p VHostPath User ConfP WriteP ReadP (2) 查看(指 ...
- RabbitMQ 权限分离&HA操作文档
概要 默认情况下,使用帐号guest帐号登陆MQ,所有用户的queue信息,全部创建在根目录/的virtual host下,而这样,就会导致,任一用户登录后,都能看到其他用户的queue信息. 针对以 ...
- rabbitmq权限细分二
禁止用户远程登录 主要有以下几步 1.进入容器 docker exec -it ID /bin/bash 2.打开配置文件 vi /etc/rabbitmq/rabbitmq.conf 3.加入配置, ...
- 【SpringSecurity系列2】基于SpringSecurity实现前后端分离无状态Rest API的权限控制原理分析
源码传送门: https://github.com/ningzuoxin/zxning-springsecurity-demos/tree/master/01-springsecurity-state ...
- RabbitMQ用户角色及权限控制
RabbitMQ的用户角色分类:none.management.policymaker.monitoring.administrator RabbitMQ各类角色描述:none不能访问 managem ...
- RabbitMQ用户角色及权限控制(转)
转载至:https://blog.csdn.net/awhip9/article/details/72123257 2017年05月15日 10:39:26 awhip9 阅读数:3538 ### ...
- RabbitMQ用户角色及权限控制 -2
1.RabbitMQ的用户角色分类: none.management.policymaker.monitoring.administrator none 不能访问 management plugin ...
- RabbitMQ用户角色及权限控制(不错)
########################用户角色####################### RabbitMQ的用户角色分类:none.management.policymaker.moni ...
随机推荐
- PHP常用设计模式讲解
开发中适当的使用设计模式,可以让项目有更易扩展,易维护.低耦合,代码简洁等 单例模式 <?php /** * 单例模式:使类在全局范围内只允许创建一个对象,常用于数据库连接等 */ class ...
- java基础(十一 )-----反射——Java高级开发必须懂的
本文我们通过一个实际的例子来演示反射在编程中的应用,可能之前大家对反射的学习,仅仅是停留在概念层面,不知道反射究竟应用在哪,所以是一头雾水.相信通过这篇教程,会让你对反射有一个更深层次的认知. 概念 ...
- WebSocket刨根问底(二)
上篇文章[WebSocket刨根问底(一)]中我们对WebSocket的一些基本理论进行了介绍,但是并没有过多的涉及到一些实战的内容,今天我希望能够用几个简单的案例来向小伙伴们展示下WebSocket ...
- .NET应用程序管理服务AMS设计
AMS全称是Application Management Server即应用程序管理服:由于经常要写些一些应用服务,每次部署和维护都比较麻烦,首先要针对服务编写一个windows服务程序方便系统启动里 ...
- Spring 完美配置跨域请求
在SpringBoot2.0 上的跨域 用以下代码配置 即可完美解决你的前后端跨域请求问题 import org.springframework.context.annotation.Bean; im ...
- ppt制作元素采集
原文链接 https://www.zhihu.com/question/52157612/answer/247501754?utm_source=qq&utm_medium=social 1动 ...
- ES6躬行记(17)——Map
一.Map Map类似于Object(对象),可用来存储键值对,但需要通过SameValueZero算法保持键的唯一性.与Set一样,在使用之前也得要实例化,如下代码所示,构造函数Map()中的参数也 ...
- Java多线程概念简介 多线程中篇(一)
Java的线程与操作系统的线程 在线程的相关介绍中,有讲到“线程的实现”分为三种:内核支持,用户级以及两者混合.(这只是一种简要的分类) Java线程在JDK1.2之前,是用户线程实现的 而在JD ...
- [转]layui点击左侧导航栏,实现不刷新整个页面,只刷新局部
本文转自:https://blog.csdn.net/s31415926_004/article/details/84256587 其实这篇文章是给自己看的,以后忘记怎么做回来还能看一下哈哈哈哈哈哈哈 ...
- 第一册:lesson 105.
原文: Full of mistakes. Where's Sandra,Bob? I want her. Do you want to speak to her? Yes I do. I want ...