1. 程式人生 > >RabbitMQ入門教程(十三):虛擬主機vhost與許可權管理

RabbitMQ入門教程(十三):虛擬主機vhost與許可權管理

虛擬主機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"

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

連線虛擬主機

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();
    }
}

這裡寫圖片描述

我的微信公眾號: