RabbitMQ权限控制原理

咱们在使用MQ搭建系统的时候,常常要开放队列给外接系统访问。外接系统的稳定性是不可控的。为了防止外接系统不稳定致使误操做破坏了MQ的配置或数据,须要对MQ作比较精细的权限控制。spa

个人需求是这样的:命令行

我有一个数据查询服务,而且经过MQ推送数据变更消息。对接MQ的每一个系统都会有本身一个独立的队列来读取消息。全部消息经过一个扇形交换机广播到全部队列。我须要这个交换机和全部队列都由管理员统一建立好。而其余系统使用的用户,均没有建立交换机和队列的权限。数据查询服务只拥有推送消息的权限,其余对接MQ的系统只拥有从本身队列读取消息的权限。code

咱们使用的MQ是RabbitMQ。我在网上搜了一下,大部分讲的是用户角色配置。对于MQ的资源受权管理讲的比较少。如下内容将主要讲解 RabbitMQ权限控制的基本概念和模型 。理解了这些基本概念后,应该能够愉快地使用RabbitMQ管理界面进行受权操做。若是大家只有命令行可用,也能很轻松地找到相应的命令。blog

RabbitMQ初始化

RabbitMQ初次启动时,初始建立这两个东西:队列

/
/

RabbitMQ受权模型

第一级控权单位是virtual host,virtual host下面第二级的控权单位是resource(包含exchange和queue)。两个相同名称的resource若是分属不一样的virtual host,则算是不一样的resource。ci

什么是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的权限 。it

若可访问,则进行 第二级控权,判断用户是否具备操做(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 。
相关文章
相关标签/搜索