不管我们是通过网页还是命令行工具创建用户对象,新创建的用户对象都不能直接使用。我们需要先把这个用户放到某个vhost下,然后给它赋予权限,有了权限,这个用户就可以正常使用了。那么今天我们就来看看RabbitMQ中的权限系统,看看权限系统长什么样子。一、RabbitMQ权限系统介绍RabbitMQ从1.6版本开始实现了ACL风格的权限系统。可能有朋友不知道什么是ACL风格的权限系统。可以看看宋哥之前发的两篇文章。:如何细化SpringSecurity中的权限粒度?一个案例演示SpringSecurity中超细粒度的权限控制!在这个ACL风格的权限管理体系中,允许进行很多细粒度的权限控制,可以为不同的用户设置读、写、配置等权限。这里涉及三种不同的权限:读:所有与消息消费相关的操作,包括清空整个消息队列。写:发布信息。配置:消息队列、交换器等的创建和删除。这里简单介绍一下RabbitMQ的权限系统。2.操作与权限的对应关系接下来下图为操作与权限的对应关系:公众号后台回复rabbitmq_permission得到本图的Excel表格。执行什么命令,需要什么权限,这张图都描述的很清楚了。3、权限操作命令RabbitMQ中权限操作命令的格式如下:rabbitmqctlset_permissions[-pvhosts]{user}{conf}{write}{read}这里有几个参数:[-pvhost]:授予用户访问权限的vhostName,如果不写,默认为/。用户:用户名。conf:用户对哪些资源具有可配置的权限(支持正则表达式)。write:用户对哪些资源有写权限(支持正则表达式)。read:用户对哪些资源有读权限(支持正则表达式)。至于可配置权限可以做什么,写权限可以做什么,读权限可以做什么,可以参考第二节,这里不再赘述。宋兄举个简单的例子。假设我们有一个用户叫zhangsan,我们想让这个用户拥有myvh虚拟主机下的所有权限,那么我们的操作命令如下:rabbitmqctlset_permissions-pmyvhzhangsan".*"".*"".*"执行结果如下:接下来执行如下命令验证是否授权成功:rabbitmqctl-pmyvhlist_permissions可以看到张三的权限已经分配到位了。在上面的授权命令中,我们都是使用“.*”。宋大哥会加上这个通配符:“.*”:意思是匹配所有的交换机和队列。"javaboy-.*":表示匹配名称以javaboy-开头的交换器和队列。"":表示不匹配任何队列和交换器(如果要撤销用户权限可以用这个)。我们可以使用如下命令去除某个用户对某个vhost的权限,例如去除zhangsan对myvh的所有权限,如下:rabbitmqctlclear_permissions-pmyvhzhangsan执行完成后,我们可以通过rabbitmqctl-pmyvhlist_permissions命令检查执行结果是否有效。最终执行效果如下:如果一个用户在多个vhost上有相应的权限,根据上面的rabbitmqctl-pmyvhlist_permissions命令,我们只能查看一个vhost上的权限。这时候我们可以通过使用如下命令查看lisi在所有vhost上的权限:rabbitmqctllist_user_permissionslisi4。web管理页面操作当然,如果你不想敲命令,也可以通过web管理终端操作权限。在“管理”选项卡中,点击用户名可以为该用户设置权限,如下:可以设置或清除权限。当然网页上还有一个TopicPermissions,这是从RabbitMQ3.7开始的新功能。可以对某个topicexchange设置权限,主要针对STOMP或者MQTT协议。我们在日常的Java开发中很少用到这个配置。.如果用户不设置,则对应的主题交易所一直有权限。5.总结,这是关于RabbitMQ权限管理的一点知识~感兴趣的小伙伴可以试试~
