RabbitMQ学习(七)——权限管理

今天我们讲解一下RabbitMQ中权限管理,主要包括在RabbitMQ中用户添加、用户角色分配、权限设置等知识,以及如何通过代码去设置权限的分配等。

RabbitMQ中的用户角色

在RabbitMQ中的用户角色主要分为五类:
超级管理员(administrator)、监控者(monitor)、决策制定者(policymaker)、普通管理者(management)和其他(none)。

每个角色对应的相应权限如下:

none:

不能登录管理控制台(启用management plugin的情况下,以下相同)

management:

用户可以通过AMQP做的任何事外加:
列出自己可以通过AMQP登入的virtual hosts
查看自己的virtual hosts中的queues, exchanges 和 bindings
查看和关闭自己的channels 和 connections
查看有关自己的virtual hosts的“全局”的统计信息,包含其他用户在这些virtual hosts中的活动

policymaker:

management的权限外加:
查看、创建和删除自己的virtual hosts所属的policies和parameters

monitoring:

management的权限外加:
列出所有virtual hosts,包括他们不能登录的virtual hosts
查看其他用户的connections和channels
查看节点级别的数据如clustering和memory使用情况
查看真正的关于所有virtual hosts的全局的统计信息

administrator :

policymaker和monitoring的权限外加:
创建和删除virtual hosts
查看、创建和删除users
查看创建和删除permissions
关闭其他用户的connections

介绍完RabbitMQ相关用户角色后,我们需要对其添加相关用户并配置角色。这里需要我们使用到rabbitmqctl命令客户端,它主要是用于管理RabbitMQ代理的命令行,是一个用于管理RabbitMQ代理的命令行工具。它通过连接到其中一个代理节点来执行所有操作。

RabbitMQ中的用户管理

rabbitmqctl add_user {username} {password}
# {username} 表示用户名; {password}表示用户密码
# 该命令将创建一个 non-administrative 用户
rabbitmqctl delete_user {username}
# 表示删除一个用户,该命令将指示RabbitMQ broker去删除指定的用户
rabbitmqctl change_password {username} {newpassword}
# 表示修改指定的用户的密码
rabbitmqctl clear_password {username}
# 表示清除指定用户的密码
# 执行此操作后的用户,将不能用密码登录,但是可能通过已经配置的SASL EXTERNAL的方式登录。
rabbitmqctl authenticate_user {username} {password}
# 表示指引RabbitMQ broker认证该用户和密码
rabbitmqctl set_user_tags {username} {tag ...}
# 表示设置用户的角色,{tag}可以是零个,一个,或者是多个。并且已经存在的tag也将会被移除。

rabbitmqctl set_user_tags admin administrator 该命令表示指示RabbitMQ Broker确保用户admin为一个管理员角色。

上述命令在用户通过AMQP方式登录时,不会有任何影响;但是如果通过其他方式,例如管理插件方式登录时,就可以去管理用户、vhost 和权限。

rabbitmqctl list_users
# 表示列出所有用户名信息

RabbitMQ中的权限控制

在上面我们添加完相关的用户后,就可以对其用户分配相关vhost的权限了。

vhost之于Rabbit就像虚拟机之于物理服务器一样,它们通过在各个实例间提供逻辑上分离,允许你为不同的应用程序安全保密地运行数据。

而在RabbitMQ中相应的权限分为读、写、配置三部分,
读、写、配置权限:

  • 读——有关消费消息的任何操作,包括“清除”整个队列(同样需要绑定操作的成功)
  • 写——发布消息(同样需要绑定操作的成功)
  • 配置——队列和交换机的创建和删除

知道了RabbitMQ权限相关的配置后,我们就可以根据具体情况来配置相应的信息。

因为RabbitMQ的权限是以vhost为分隔的,所以我们需要确定一个vhost来确定相关的权限设置,默认的vhost是“/”。

rabbitmqctl add_vhost {vhost}
# {vhost} 表示待创建的虚拟主机项的名称
rabbitmqctl delete_vhost {vhost}
# 表示删除一个vhost。删除一个vhost将会删除该vhost的所有exchange、queue、binding、用户权限、参数和策略。
rabbitmqctl list_vhosts {vhostinfoitem ...}
# 表示列出所有的vhost。其中 {vhostinfoitem} 表示要展示的vhost的字段信息,展示的结果将按照 {vhostinfoitem} 指定的字段顺序展示。这些字段包括: name(名称) 和 tracing (是否为此vhost启动跟踪)。
# 如果没有指定具体的字段项,那么将展示vhost的名称。
rabbitmqctl set_permissions [-p vhost] {user} {conf} {write} {read}
# 表示设置用户权限。 {vhost} 表示待授权用户访问的vhost名称,默认为 "/"; {user} 表示待授权反问特定vhost的用户名称; {conf}表示待授权用户的配置权限,是一个匹配资源名称的正则表达式; {write} 表示待授权用户的写权限,是一个匹配资源名称的正则表达式; {read}表示待授权用户的读权限,是一个资源名称的正则表达式。
# rabbitmqctl set_permissions -p /  admin "^mip-.*" ".*" ".*"
# 例如上面例子,表示授权给用户 "admin" 具有所有资源名称以 "mip-" 开头的 配置权限;所有资源的写权限和读权限。
rabbitmqctl clear_permissions [-p vhost] {username}
# 表示设置用户拒绝访问指定指定的vhost,vhost默认值为 "/"
rabbitmqctl list_permissions [-p vhost]
# 表示列出具有权限访问指定vhost的所有用户、对vhost中的资源具有的操作权限。默认vhost为 "/"。
# 注意,空字符串表示没有任何权限。
rabbitmqctl list_user_permissions {username}
# 表示列出指定用户的权限vhost,和在该vhost上的资源可操作权限。

通过上面我们对RabbitMQ基本的用户和权限设置有了基本的了解,接下来我们便开始实际操作。

我们使用上面的命令查看,可以发现在RabbitMQ中自带的用户guest,并且具有相应的用户权限,如下:

guest info

我们先添加一个名为“test”的vhost,然后添加用户admin,并赋予administrator角色,然后再给admin用户赋予相应的权限。

test_vhost

接着我们给admin的在test下的相应权限,这里配置了admin在test虚拟机vhost下,对于mip.*开头的配置权限和所有资源的写权限和读权限。

admin_permissions

一个用户可以绑定多个vhost赋予权限,当然我们也可以给admin用户赋予vhost为“/”的相应的配置,读,写的权限。

这里是提供了命令相关来配置RabbitMQ的相关配置信息,如果用户没有相应的权限是无法创建交换机,队列,也是无法进行绑定的。

除了使用rabbitmqctl来进行配置,当我们的RabbitMQ启用management plugin插件后,我们可以通过GUI来直接进行可视化管理。。

当我们以guest登录RabbitMQ的管理界面时,我们可以发现刚刚我们新增配置的用户和权限。

users

对应的权限,

permission

接着我们使用新增的用户登录,接着选择test虚拟机下新建一个test队列,发现提示没权限错误。

403

这是因为我们只对mip开头的队列和交换机才有权限,当我们新建mip.test的队列和mip.exchange交换机则会成功!

queues

这里的管理界面操作和rabbitmqctl提供的功能是一样的,只是它提供了可视化的操作。

同理如果我们的客户端,无论是消息生产者还是消息消费者,如果没有相应的权限是无法进行监听和创建队列以及交换机的,并且会报错,以Spring Boot的MQ连接为例,没有权限,报如下错误。

exception1

exception2

通过Restful接口来控制RabbitMQ中的权限

有时候我们需要通过Restful来实现RabbitMQ中的权限管理,这时候就可以通过management plugin插件提供的接口来实现相关的编码功能。

HTTP API

为我们提供了完善的相关任务的接口,我们可以具体查看相关文档。

API2

在代码中我们需要在HTTP请求头中添加Authorization: Basic Z3Vlc3Q6Z3Vlc3Q=,这里的为Authorization: “Basic 用户名和密码的base64加密字符串”

这里我用Postman来模拟一下,查找到新建用户接口,PUT请求,接口如下:
add user

接着我们在Postman中配置好相关信息,如下:

Authorization

data

接着我们发起请求,可以发现后台新建用户成功!

add user

其他关于RabbitMQ的赋权、删除用户、添加交换机和队列都可以如此实现!

好了,RabbitMQ的权限介绍到此结束,欢迎一起讨论!

参考

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值