原文:RabbitMQ入门教程(十三):虚拟主机vhost与权限管理
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/vbirdbest/article/details/78702685
分享一个朋友的人工智能教程。比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看。
虚拟主机vhost
每一个RabbitMQ服务器都能创建虚拟消息服务器,我们称之为虚拟主机。每一个vhost本质上是一个mini版的RabbitMQ服务器,拥有自己的交换机、队列、绑定等,拥有自己的权限机制。vhost之于Rabbit就像虚拟机之于物理机一样。他们通过在各个实例间提供逻辑上分离,允许为不同的应用程序安全保密的运行数据,这很有,它既能将同一个Rabbit的众多客户区分开来,又可以避免队列和交换器的命名冲突。RabbitMQ提供了开箱即用的默认的虚拟主机“/”,如果不需要多个vhost可以直接使用这个默认的vhost,通过使用缺省的guest用户名和guest密码来访问默认的vhost。
vhost之间是相互独立的,这避免了各种命名的冲突,就像App中的沙盒的概念一样,每个沙盒是相互独立的,且只能访问自己的沙盒,以保证非法访问别的沙盒带来的安全隐患。
虚拟主机操作
- 列举所有虚拟主机
rabbitmqctl list_vhosts
- 添加虚拟主机
rabbitmqctl add_vhost <vhost_name>
- 删除虚拟主机
rabbitmqctl delete_vhost <vhost_name>
- 添加用户
add_user <username> <password>
- 设置用户标签
set_user_tags <username> <tag>
// 设置这个才能在页面上登录,tag可以为administrator, monitoring, management - 设置权限
set_permissions [-p <vhost>] <user> <conf> <write> <read>
权限配置包括:配置(队列和交换机的创建和删除)、写(发布消息)、读(有关消息的任何操作,包括清除这个队列)
conf:一个正则表达式match哪些配置资源能够被该用户访问。
write:一个正则表达式match哪些配置资源能够被该用户读。
read:一个正则表达式match哪些配置资源能够被该用户访问
权限配置是针对于vhost进行配置的,如果有多个vhost,如果某个用户需要相同的配置就要配置多次。".":匹配任何队列和交换器,"checks-.":只匹配checks-开头的队列和交换器,"":不匹配队列和交换器,
? ~ rabbitmqctl add_user root root
Creating user "root"
? ~ rabbitmqctl set_user_tags root administrator
Setting tags for user "root" to [administrator]
? ~ rabbitmqctl add_vhost my_vhost
Creating vhost "my_vhost"
? ~ rabbitmqctl set_permissions -p my_vhost root ".*" ".*" ".*"
Setting permissions for user "root" in vhost "my_vhost"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
连接虚拟主机
public class Producer {
@Test
public void testBasicPublish() throws IOException, TimeoutException, InterruptedException {
ConnectionFactory factory = new ConnectionFactory();
// 指定虚拟主机的名称,默认是"/"
factory.setVirtualHost("my_vhost");
factory.setHost("127.0.0.1");
factory.setPort(AMQP.PROTOCOL.PORT);
factory.setUsername("root");
factory.setPassword("root");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
String EXCHANGE_NAME = "exchange.direct";
String QUEUE_NAME = "queue_name";
String ROUTING_KEY = "key";
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY);
String message = "Hello RabbitMQ:";
try {
channel.txSelect();
for (int i = 0; i < 5; i++) {
channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, null, (message + i).getBytes("UTF-8"));
}
channel.txCommit();
} catch (Exception e) {
channel.txRollback();
}
channel.close();
connection.close();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
分享一个朋友的人工智能教程。比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看。
我的微信公众号:
原文地址:https://www.cnblogs.com/lonelyxmas/p/11865810.html