我们在使用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主要对应读取消息操作。

后面有个表格列出了具体的对应关系。

当管理员对一个用户进行授权时,要配置两个元素:

  1. 允许什么操作,即configure、write、read三种operation;
  2. 操作什么resource。用户是否拥有某资源的权限,通过对该资源的名称与授权时配置的正则进行匹配来判断。

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

例子:

  • 如果要给用户授权可以往exchange foo推消息,则我们找到basic.publish这行,格子不是空的只有write这列,所以我们需要给用户授权一个write权限,其正则可以匹配字符串foo(比如说^foo$,或者.*等)。
  • 如果要给用户授权只能从queue bar读取消息,则需要给用户授权一个read权限,其正则可以匹配字符串bar

进一步了解

本文内容基本来自官网手册,如果需要更详细的说明——比如说topic的授权,可以直接看手册。很多时候,当你刚接触一个新工具时,比起在互联网上瞎逛,直接阅读官方手册效率会高很多。虽然手册比较冗长,而且大部分只有纯英文,但毕竟最远的路,就是最快的捷径。

RabbitMQ权限控制原理的更多相关文章

  1. RabbitMQ权限

    RabbitMQ 引言 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消息队 ...

  2. rabbitMQ权限相关命令

    权限相关命令为: (1) 设置用户权限 rabbitmqctl  set_permissions  -p  VHostPath  User  ConfP  WriteP  ReadP (2) 查看(指 ...

  3. RabbitMQ 权限分离&HA操作文档

    概要 默认情况下,使用帐号guest帐号登陆MQ,所有用户的queue信息,全部创建在根目录/的virtual host下,而这样,就会导致,任一用户登录后,都能看到其他用户的queue信息. 针对以 ...

  4. rabbitmq权限细分二

    禁止用户远程登录 主要有以下几步 1.进入容器 docker exec -it ID /bin/bash 2.打开配置文件 vi /etc/rabbitmq/rabbitmq.conf 3.加入配置, ...

  5. 【SpringSecurity系列2】基于SpringSecurity实现前后端分离无状态Rest API的权限控制原理分析

    源码传送门: https://github.com/ningzuoxin/zxning-springsecurity-demos/tree/master/01-springsecurity-state ...

  6. RabbitMQ用户角色及权限控制

    RabbitMQ的用户角色分类:none.management.policymaker.monitoring.administrator RabbitMQ各类角色描述:none不能访问 managem ...

  7. RabbitMQ用户角色及权限控制(转)

    转载至:https://blog.csdn.net/awhip9/article/details/72123257 2017年05月15日 10:39:26 awhip9 阅读数:3538   ### ...

  8. RabbitMQ用户角色及权限控制 -2

    1.RabbitMQ的用户角色分类: none.management.policymaker.monitoring.administrator none 不能访问 management plugin ...

  9. RabbitMQ用户角色及权限控制(不错)

    ########################用户角色####################### RabbitMQ的用户角色分类:none.management.policymaker.moni ...

随机推荐

  1. apollo客户端springboot实战(四)

    1. apollo客户端springboot实战(四) 1.1. 前言   经过前几张入门学习,基本已经完成了apollo环境的搭建和简单客户端例子,但我们现在流行的通常是springboot的客户端 ...

  2. JavaScript02-js使用

    JS的用法有两种: 第一种是在html页面通过引入外部js文件,第二种是直接将js代码写在html中.小例如下: 第一种 <script type="text/javascript&q ...

  3. Cassandra与Mongo的事务实现之分布式协议

    摘要 NoSql不同于关系型数据库,是分布式存储,因此想要实现关系型数据库中的事务就不是那么简单了.本文结合Cassandra中的paxos和Mongo的two phase commit来谈谈Nosq ...

  4. C# 多线程学习笔记 - 3

    本文主要针对 GKarch 相关文章留作笔记,仅在原文基础上记录了自己的理解与摘抄部分片段. 遵循原作者的 CC 3.0 协议. 如果想要了解更加详细的文章信息内容,请访问下列地址进行学习. 原文章地 ...

  5. 使用ML.NET + Azure DevOps + Azure Container Instances打造机器学习生产化

    介绍 Azure DevOps,以前称为Visual Studio Team Services(VSTS),可帮助个人和组织更快地规划,协作和发布产品.其中一项值得注意的服务是Azure Pipeli ...

  6. shell实战之Linux主机系统监控

    1.系统监控概述 采集的监控信息主要有内存占用率,CPU占用率,当前在线用户,磁盘挂载及磁盘空间使用率,平均每秒写入流量,平均每秒流出流量.磁盘IO:平均每秒从磁盘读入内存的速率,平均每秒从内存写入磁 ...

  7. TCP/IP 三次握手

    网络连接状态 网络连接状态(11种)非常重要这里既包含三次握手中的也包括四次断开中的,所以要熟悉. LISTEN 被动打开,首先服务器需要打开一个socket进行监听,监听来自远方TCP端口的连接请求 ...

  8. 看板中的WIP限制

    WIP限制并不是真的要限制你的进度,事实上正相反. 什么是WIP限制? 在敏捷开发中,WIP限制决定了每种情况下的工作流中可以存续的最大工作量.限制进行中的工作数量可以更容易辨识团队工作流中的无效工作 ...

  9. Linux命令收集

    文件处理命令:ls 功能描述:显示目录文件 命令英文原意:list 命令所在路径:/bin/ls 执行权限:所有用户 语法:  ls  选项[-ald]  [文件或目录] -a    显示所有文件,包 ...

  10. 异常处理器详解 Java多线程异常处理机制 多线程中篇(四)

    在Thread中有异常处理器相关的方法 在ThreadGroup中也有相关的异常处理方法 示例 未检查异常 对于未检查异常,将会直接宕掉,主线程则继续运行,程序会继续运行 在主线程中能不能捕获呢? 我 ...