参考 http://blog.163.com/sky20081816@126/blog/static/16476102320107173226920/
http://blog.csdn.net/kevin3101/article/details/53609180
question 1: what is virtual_host
2:How does it work
一. what is it
There are four building blocks you really care about in AMQP: virtual hosts, exchanges, queues and bindings. A virtual host holds a bundle of exchanges, queues and bindings. Why would you want multiple virtual hosts? Easy. A username in RabbitMQ grants you access to a virtual host…in its entirety. So the only way to keep group A from accessing group B’s exchanges/queues/bindings/etc. is to create a virtual host for A and one for B. Every RabbitMQ server has a default virtual host named “/”. If that’s all you need, you’re ready to roll.
in its entirety:作为一个整体
红色部分语句的意思:vhost是rabbitmq分配权限的最小细粒度。比如我们可以为一个用户分配一个可以访问哪个或者哪一些vhost的权限。但是不能为用户分配一个可以访问哪一些exchange,或者queue的权限,因为rabbitmq的权限细粒度没有细化到交换器和队列,他的最小细粒度是vhost(vhost中包含许多的exchanges,queues,bingdings)。所以如果exchangeA 和queueA 只能让用户A访问,exchangeB 和queueB 只能让用户B访问,要达到这种需求,只能为exchangeA 和queueA创建一个vhostA,为exchangeB 和queueB 创建vhostB,这样就隔离开来了。
补充:一个broker可以开设多个vhost,用于不同用户的权限分离
virtualHost is used as a namespace for AMQP resources (default is \"/\"), so different applications could use multiple virtual hosts on the
same AMQP server
virtual host只是起到一个命名空间的作用,所以可以多个user共同使用一个virtual host,文章开头写的vritual_host = '/',这个是系统默认的,就是说当我们创建一个到rabbitmq的connection时候,它的命名空间是'/',需要注意的是不同的命名空间之间的资源是不能访问的,比如 exchang,queue ,bingding等
二.How does it work
既然vitrual host 只是一个命名空间,那么我们就可以自己创建一个喽,怎么去干呢?这里我们需要用到工具 :rabbitmqctl,安装rabbitMQ的时候已经安装好了。这真是一个强大的工具阿。输入 ./rabbitmqctl,我们可以看到
首先我们可以建立一个测试用户(如果你想用系统默认的guest也可以)
rabbitmqctl add_user test 123456 ,这样我们就新建了一个可以连到rabbitmq的用户,用户名时test,密码是123456
我们可以用 rabbitmqctl list_users 看看有多少个用户了,可以看到有guest和test了吧
然后 我们通过 rabbitmqctl add_vhosts命令新建一个virtual host : rabbitmqctl add_vhosts test_host
我们通过 rabbitmqctl list_vhosts命令看看现在系统有几个vhost了。可以看到有两个,一个是系统默认的 '/', 还有一个就 是我们新建的 test_host。
但是到这里是不够的,我们只是声明了一个vhost,我们还要给它分配访问权限。
rabbitmqctl set_permissions -p test_host test "test-*" ".*" ".*",如此用户名为test的用户就可以访问vitrual host为test_host的资源了,并且具备读写的权限。
rabbitmqctl set_permissions -p /vhost1 user_admin ".*" ".*" ".*" ,命令使用户user_admin具有/vhost1这个virtual host中所有资源的配置、写、读权限以便管理其中的资源
对何种资源具有配置、写、读的权限通过正则表达式来匹配,具体命令如下:
set_permissions [-p <vhostpath>] <user> <conf> <write> <read>
其中,<conf> <write>
<read>的位置分别用正则表达式来匹配特定的资源,如'^(amq\.gen.*|amq\.default)$'可以匹配server生成的和默认的exchange,'^$'不匹配任何资源
需要注意的是RabbitMQ会缓存每个connection或channel的权限验证结果、因此权限发生变化后需要重连才能生效。
Vhost的权限
关于rabbitmq权限的几点:
rabbitmq的权限控制通过两层来实现,一是vhost的权限,二是确认有权限访问vhost后,对vhost内资源的权限控制(配置,读,写)
1.默认的guest用户
安装rabbitmq(3.3.1),并启用management plugin后,使用默认的账号guest登陆管理控制台,却提示登陆失败。
翻看官方的release文档后,得知由于账号guest具有所有的操作权限,并且又是默认账号,出于安全因素的考虑,guest用户只能通过localhost登陆使用,并建议修改guest用户的密码以及新建其他账号管理使用rabbitmq(该功能是在3.3.0版本引入的)。
虽然可以以比较猥琐的方式:将ebin目录下rabbit.app中loopback_users里的<<"guest">>删除,或者在配置文件rabbitmq.config中对该项进行配置,
2.权限工作流程
一个客户端连接到服务器后,指定一个所操作虚拟机。这是权限产生作用的第一层,服务器会检查该用户是否有权限访问该虚拟机,有则进行下一层,否则拒绝连接。
资源,如一个虚拟机内的交换器、队列等,在资源上rabbitmq提供三种类型的操作,配置、读、写。当客户端被允许连接到某虚拟机后,服务器根据客户端所拥有的权限,允许其做相应的操作。
权限配置支持正则表达式,可以实现一定粒度的权限控制,比如说对某一类队列的控制。
3.rabbitmqctl中对用户的管理命令
rabbitmqctl list_users
add_user {username} {password}
#rabbitmqctl add_user admin 123456
delete_user {username}
#rabbitmqctl delete_user admin
change_password {username} {newpassword}
#rabbitmqctl change_password admin 111111
clear_password {username}
#rabbitmqctl clear admin
set_user_tags {username} {tag ...}
#rabbitmqctl set_user_tags admin administrator #可跟多少tag,tag为空的时候表示清除原有
set_permissions [-p vhost] {user} {conf} {write} {read}
#rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
clear_permissions [-p vhost] {username}
list_permissions [-p vhost]
#rabbitmqctl list_permissions -p "/"
list_user_permissions {username}
#rabbitmqctl list_user_permissions admin
我们在获取设备连接的时候可以指定用户,并且指定vhost,当然该用户需要有该vhost的权限才可以。
ConnectionFactory factory = new ConnectionFactory();
factory.setUsername(userName);//指定用户
factory.setPassword(password);//用户密码
factory.setVirtualHost(virtualHost); //指定vhost
factory.setHost(hostName);//指定rabbitmq服务器的主机
factory.setPort(portNumber);//指定rabbitmq服务器所监听的端口号
Connection conn = factory.newConnection();
目前还有的疑问:
1.一次连接,只能指定一个vhost吗?
2.用户和vhost的关系,是多对多吗?
3.如果是,那么在创建连接之后,我们的消费者能否指定的从某一个vhost的某一个queue去接收数据,或者生产者能否指定的向某一个vhost的exchange发送数据。
意思就是如果一个用户可以拥有多个vhost的权限,是否可以创建一次连接,然后动态的切换vhost。
关于rabbitmq权限的文章
http://blog.csdn.net/zyz511919766/article/details/42292655
- RabbitMQ vhost 配置
RabbitMQ vhost 配置 rabbitmqctl set_vhost_limits是用来定义虚拟主机限制的命令 配置最大连接限制 要限制vhost vhost_name中并发客户端连接的 总 ...
- (转)[Erlang 0080] RabbitMQ :VHost,Exchanges, Queues,Bindings and Channels
和RabbitMQ这个项目的缘分好奇怪,很长一段时间内是只关注源代码,真的是Erlang开源项目中的典范;现在要在项目中应用RabbitMQ,从新的视角切入,全新的感觉.仿佛旧情人换了新衣,虽是熟稔却 ...
- RabbitMQ :VHost,Exchanges, Queues,Bindings and Channels
和RabbitMQ这个项目的缘分好奇怪,很长一段时间内是只关注源代码,真的是Erlang开源项目中的典范;现在要在项目中应用RabbitMQ,从新的视角切入,全新的感觉.仿佛旧情人换了新衣,虽是熟稔却 ...
- RabbitMQ系列之Centos 7安装RabbitMQ 3.6.1
1.安装EPEL-7: rpm -ivh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm 2.安 ...
- RabbitMQ(二)
一.启用 rabbitmq_management 插件(官网提供的 web 版管理工具) cd /usr/sbin rabbitmq-plugins enable rabbitmq_managemen ...
- 探索 OpenStack 之(14):OpenStack 中 RabbitMQ 的使用
本文是 OpenStack 中的 RabbitMQ 使用研究 两部分中的第一部分,将介绍 RabbitMQ 的基本概念,即 RabbitMQ 是什么.第二部分将介绍其在 OpenStack 中的使用. ...
- RabbitMQ - 实例操作
以前在单项目中用过RabbitMQ,没有问题 不过这次在分布式项目中使用RabbitMQ中有点搞糊涂了,但是实际上是没有问题的,思路清晰就行 简单看一下实际操作的示例吧: 资源文件中需要配置基本的ra ...
- streamsets 集成 rabbitmq 以及benthos stream 处理框架
benthos 是一个stream 处理框架,streamsets 也是,但是两者可以通过不同的工具进行集成起来 一般我们可以使用http 服务,消息中间件(kafka.rabbitmq ...) 使 ...
- RabbitMQ之项目中实战
说了那么多,还不是为了在项目中进行实战吗,在实践中检验真理,不然我学他干嘛,不能解决项目中的实际问题的技术都是耍流氓... 一.后台管理系统发送消息 瞎咧咧:后台管理系统发送消息到交换机中,然后通知其 ...
随机推荐
- Google In-App Billing 实现(内含Unity 实现经验)
实现内购计费 傻逼目录 Adding the AIDL file Updating Your Manifest Creating a ServiceConnection Making In-app ...
- android NDK 开发环境搭建
基于 Android NDK 的学习之旅-----环境搭建 工欲善其事必先利其器 , 下面介绍下 Eclipse SDK NDK Cygwin CDT 集成开发环境的搭建. 1.Android 开发环 ...
- python笔记29-队列Queue
前言 Python的Queue模块提供一种适用于多线程编程的FIFO实现.它可用于在生产者(producer)和消费者(consumer)之间线程安全(thread-safe)地传递消息或其它数据,因 ...
- selenium+python自动化82-只截某个元素的图
前言 selenium截取全图小伙伴们都知道,曾经去面试的时候,面试官问:如何截图某个元素的图?不要全部的,只要某个元素...小编一下子傻眼了, 苦心人,天不负,终于找到解决办法了. selenium ...
- pytest文档16-用例a失败,跳过测试用例b和c并标记失败xfail
前言 当用例a失败的时候,如果用例b和用例c都是依赖于第一个用例的结果,那可以直接跳过用例b和c的测试,直接给他标记失败xfail 用到的场景,登录是第一个用例,登录之后的操作b是第二个用例,登录之后 ...
- JTable常见用法细则
JTable是Swing编程中很常用的控件,这里总结了一些常用方法以备查阅.欢迎补充,转载请注明作者与出处. 一.创建表格控件的各种方式:1) 调用无参构造函数. JTable table = ne ...
- 《CWNA官方学习指南(第3版):认证无线网络管理员PW0-105》
<CWNA官方学习指南(第3版):认证无线网络管理员PW0-105> 基本信息 原书名:CWNA: Certified Wireless Network Administrator Off ...
- spoj Goblin Wars(简单bfs)
J - Goblin Wars Time Limit:432MS Memory Limit:1572864KB 64bit IO Format:%lld & %llu Submit ...
- 系统对接API调用
在与公司外部系统对接时,API接口一般采用REST风格,对外暴露HTTP服务.只需要将入参封装好,并发起HTTP请求即可.具体请求流程如下图所示: 数据格式 API调用参数分为系统参数和业务参数,请求 ...
- Objective-C:Objective-C:文件中一些对目录进行操作的函数
IO文件中,一些对目录进行操作的函数:获取.切分.组合 一些对目录进行操作的函数: 获取用户的姓名:(NSString*)NSUserName() ; ———>NSString *Str ...