咱们在使用MQ搭建系统的时候,常常要开放队列给外接系统访问。外接系统的稳定性是不可控的。为了防止外接系统不稳定致使误操做破坏了MQ的配置或数据,须要对MQ作比较精细的权限控制。spa
个人需求是这样的:命令行
我有一个数据查询服务,而且经过MQ推送数据变更消息。对接MQ的每一个系统都会有本身一个独立的队列来读取消息。全部消息经过一个扇形交换机广播到全部队列。我须要这个交换机和全部队列都由管理员统一建立好。而其余系统使用的用户,均没有建立交换机和队列的权限。数据查询服务只拥有推送消息的权限,其余对接MQ的系统只拥有从本身队列读取消息的权限。code
咱们使用的MQ是RabbitMQ。我在网上搜了一下,大部分讲的是用户角色配置。对于MQ的资源受权管理讲的比较少。如下内容将主要讲解 RabbitMQ权限控制的基本概念和模型 。理解了这些基本概念后,应该能够愉快地使用RabbitMQ管理界面进行受权操做。若是大家只有命令行可用,也能很轻松地找到相应的命令。blog
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)有这么三种:
后面有个表格列出了具体的对应关系。
当管理员对一个用户进行受权时,要配置两个元素:
下面这张表详细描述了operation、resource和用户可执行的操做的关系:
例子:
foo
推消息,则咱们找到basic.publish这行,格子不是空的只有write这列,因此咱们须要给用户受权一个write权限,其正则能够匹配字符串 foo
(好比说 ^foo$
,或者 .*
等)。bar
读取消息,则须要给用户受权一个read权限,其正则能够匹配字符串 bar
。