RabbitMQ管理(1)——多租户与权限

简介: 每一个RabbitMQ服务器都能创建虚拟的消息服务器,我们称之为虚拟主机(virtual host),简称为vhost。每一个vhost本质上是一个独立的小型RabbitMQ服务器,拥有自己独立的队列、交换器以及绑定关系等待,并且它拥有自己独立的权限。

每一个RabbitMQ服务器都能创建虚拟的消息服务器,我们称之为虚拟主机(virtual host),简称为vhost。每一个vhost本质上是一个独立的小型RabbitMQ服务器,拥有自己独立的队列、交换器以及绑定关系等待,并且它拥有自己独立的权限。vhost就像是虚拟机与物理服务器一样,它们在各个实例间提供逻辑上的分离,允许你为不同程序安全保密地运行数据,它既能将同一个RabbitMQ的中众多客户区分开,又可以避免队列和交换器等命令冲突。vhost之间是绝对隔离的,你无法将vhost1中的交换器与vhost2中的队列进行绑定,这样既保证了安全性,又可以确保可移植性。如果在使用RabbitMQ达到一定规模的时候,建议用户对业务功能、场景进行归类区分,并为之分配独立的vhost。

vhost是AMQP概念的基础,客户端在连接的时候必须制定一个vhost。RabbitMQ默认已创建的vhost为“/”,如果不需要多个vhost或者对vhost的概念不是很理解,那么就用这个默认的vhost也是非常合理的,使用默认的用户名guest和密码guest就可以访问它。但是为了安全以及方便,建议重新建立一个新的用户来访问它。

可以使用rabbitmqctl add_vhost {vhost}命令创建一个新的vhost,大括号里的参数表示vhost的名称。示例如下:

[root@node1 ~]# rabbitmqctl add_vhost vhost1
Creating vhost "vhost1"
 ```
可以使用rabbitmqctl list_vhosts [vhostinfoitem...]来罗列当前vhost的相关信息。目前vhostinfoitem的取值有2个:

  1. name:表示vhost的名称。
  2. tracing:表示是否使用了RabbitMQ的trace功能。有关trace功能,详细可以参考10.1章节。

示例如下:
 ```
[root@node1 ~]# rabbitmqctl list_vhosts name tracing
Listing vhosts
vhost1      false
/       false
[root@node1 ~]# rabbitmqctl trace_on
Starting tracing for vhost "/"
[root@node1 ~]# rabbitmqctl list_vhosts name tracing
Listing vhosts
vhost1      false
/       true

对应的删除的vhost的命令是:rabbitmqctl delete_vhost {vhost},其中大括号里面的参数表示vhost的名称。删除一个vhost同时也会删除其下所有的队列、交换器、绑定关系、用户权限、参数以及策略等信息。示例如下:

[root@node1 ~]# rabbitmqctl delete_vhost vhost1
Deleting vhost "vhost1"
[root@node1 ~]# rabbitmqctl list_vhosts
Listing vhosts

AMQP协议中并没有指定权限在vhost级别还是在服务器端级别实现,由具体的应用自定义。在RabbitMQ中,权限控制则是以vhost为单位的。当创建一个用户时,用户通常会被指派给至少一个vhost,并且只能访问被指派vhost内的队列、交换器以及绑定关系。因此,RabbitMQ中的授予权限是指在vhost级别对用户而言的权限授予。

相关的授予权限命令为:rabbitmqctl set_permissions [-p vhost] {user} {conf} {write} {read}。其中各个参数的含义为:

  1. vhost:授予用户访问权限的vhost名称,可以缺省,即vhost为”/”。
  2. user:可以访问指定vhost的用户名称。
  3. conf:一个用于匹配用户在哪些资源上拥有可配置权限的正则表达式。
  4. write:一个用于匹配用户在哪些资源上拥有可写权限的正则表达式。
  5. read:一个用于匹配用户在哪些资源上有用可读权限的正则表达式。

注:可配置指的是队列和交换器的创建以及删除之类的操作;可写指的是发布消息;可读指与消息有关的操作,包括读取消息以及清空整个队列等。

授予用户root可访问虚拟主机vhost1,并在所有资源上都具备可配置、可写以及可读的权限。示例如下:

[root@node1 ~]# rabbitmqctl set_permissions -p vhost1 root ".*" ".*" ".*"
Setting permissions for user "root" in vhost "vhost1"

授予用户root可访问虚拟主机vhost2,在以“queue”开头的资源上具备可配置权限,并在所有资源上拥有可写、可读的权限,示例如下:

[root@node1 ~]# rabbitmqctl set_permissions -p vhost2 root "^queue.*" ".*" ".*"
Setting permissions for user "root" in vhost "vhost2"

清除权限也是在vhost级别对用户而言的清除权限。清除权限的命令为:rabbitmqctl clear_permissions [-p vhost] {username}。其中vhost用于设置禁止用户访问的虚拟主机的名称,默认为“/”;username表示禁止访问特定虚拟主机的用户名称。示例如下:

[root@node1 ~]# rabbitmqctl clear_permissions -p vhost1 root
Clearing permissions for user "root" in vhost "vhost1"

在RabbitMQ中有两个shell命令可以列举权限信息。第一个命令是:rabbitmqctl list_permissions [-p vhost],用来显示虚拟主机上的权限;第二个命令是:rabbitmqctl list_user_permissions {username},用来显示用户的权限。示例如下:

[root@node1 ~]# rabbitmqctl list_permissions -p vhost1
Listing permissions in vhost "vhost1"
root .*      .*      .*
[root@node1 ~]# rabbitmqctl list_user_permissions root
Listing permissions for user "root"
/       .*      .*      .*
vhost1      .*      .*      .*

细心的读者可能会注意到本章节中用到的所有命令都是rabbitmqctl工具的扩展命令,rabbitmqctl工具是用来管理RabbitMQ中间件的命令行工具,它通过连接各个RabbitMQ节点来执行所有操作。如果有节点没有运行,将会显示诊断信息、不能到达,或因不匹配的Erlang cookie(有关Erlang cookie的细节可以参考7.1章节)而拒绝连接。rabbitmqctl工具的标准语法如下:

rabbitmqctl [-n node] [-t timeout] [-q] {command} [command options...]

[-n node]
默认节点是”rabbit@hostname”,此处的hostname是主机名称。在一个名为”node.hidden.com”的主机上, RabbitMQ Erlang node 的节点名称通常是rabbit@node (除非RABBITMQ_NODENAME参数在启动时设置了非默认值)。 hostname -s 的输出通常是”@” 标志后的东西。
[-q]
使用-q标志来启用quiet模式,这样可以屏蔽一些消息的输出。 默认不开启quiet模式。
[-t timeout]
操作超时时间(秒为单位)。只适用于“list”类型的命令。 默认是无穷大。
下面来演示下[-q]和[-t timeout]参数的用法和效果:

[root@node1 ~]# rabbitmqctl list_vhosts
Listing vhosts
/
[root@node1 ~]# rabbitmqctl list_vhosts -q
/
[root@node1 ~]# rabbitmqctl list_vhosts -q -t 1
/
[root@node1 ~]# rabbitmqctl list_vhosts -q -t 0
Error: {timeout,0.0}
相关实践学习
RocketMQ一站式入门使用
从源码编译、部署broker、部署namesrv,使用java客户端首发消息等一站式入门RocketMQ。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
3月前
|
消息中间件 Docker 容器
Docker中的RabbitMQ已经启动运行,但是管理界面打不开
Docker中的RabbitMQ已经启动运行,但是管理界面打不开
|
9天前
|
消息中间件 存储 数据库
RabbitMQ入门指南(二):架构和管理控制台的使用
RabbitMQ是一个高效、可靠的开源消息队列系统,广泛用于软件开发、数据传输、微服务等领域。本文主要介绍了RabbitMQ架构和管理控制台的使用等内容。
27 0
RabbitMQ入门指南(二):架构和管理控制台的使用
|
5月前
|
消息中间件 数据安全/隐私保护 Windows
windows下RabbitMQ安装后,无法进入web管理页面问题
windows下RabbitMQ安装后,无法进入web管理页面问题
140 1
|
5月前
|
消息中间件 关系型数据库 MySQL
消息中间件系列教程(05) -RabbitMQ -管理控制台的使用
消息中间件系列教程(05) -RabbitMQ -管理控制台的使用
26 1
|
1月前
|
消息中间件 存储 NoSQL
【Redis项目实战】使用Springcloud整合Redis分布式锁+RabbitMQ技术实现高并发预约管理处理系统
【Redis项目实战】使用Springcloud整合Redis分布式锁+RabbitMQ技术实现高并发预约管理处理系统
|
5月前
|
消息中间件
RabbitMQ管理命令
RabbitMQ管理命令
|
5月前
|
消息中间件 数据安全/隐私保护 Windows
windows下RabbitMQ安装后,无法进入web管理页面问题
windows下RabbitMQ安装后,无法进入web管理页面问题
108 0
|
消息中间件 数据安全/隐私保护
解决第一次安装后无法访问RabbitMQ的UI管理界面问题#127.0.0.1:15672无法访问#localhhost:15672无法访问
解决第一次安装后无法访问RabbitMQ的UI管理界面问题#127.0.0.1:15672无法访问#localhhost:15672无法访问
506 0
|
消息中间件 存储 Java
Springboot----项目整合微信支付与RabbitMQ(使用RabbitMQ延迟插件实现订单管理)
主要介绍如何在Springboot项目支付模块中使用RabbitMQ实现延迟队列,采用的是RabbitMQ的延迟插件
245 0
Springboot----项目整合微信支付与RabbitMQ(使用RabbitMQ延迟插件实现订单管理)