RabbitMQ权限控制原理

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


我的需求是这样的:


我有一个数据查询服务,并且通过MQ推送数据变动消息。对接MQ的每个系统都会有自己一个独立的队列来读取消息。所有消息通过一个扇形交换机广播到所有队列。我需要这个交换机和所有队列都由管理员统一创建好。而其他系统使用的用户,均没有创建交换机和队列的权限。数据查询服务只拥有推送消息的权限,其他对接MQ的系统只拥有从自己队列读取消息的权限。


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


1|0RabbitMQ初始化


RabbitMQ初次启动时,初始创建这两个东西:



  • 一个名称为/的virtual host

  • guest用户,拥有/的全部权限,只能localhost访问


2|0RabbitMQ授权模型


第一级控权单位是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


3|0进一步了解


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


__EOF__

本文作者yangzhuxian Love wzy
本文链接https://www.cnblogs.com/yangzhuxian/p/13415902.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   yangzhuxian  阅读(301)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示