您好,登錄后才能下訂單哦!
這篇文章主要介紹“RocketMQ ACL的原理和使用”,在日常操作中,相信很多人在RocketMQ ACL的原理和使用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”RocketMQ ACL的原理和使用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
ACL是access control list的簡稱,俗稱訪問控制列表。訪問控制,基本上會涉及到用戶、資源、權限、角色等概念,那在RocketMQ中上述會對應哪些對象呢?
用戶 用戶是訪問控制的基礎要素,也不難理解,RocketMQ ACL必然也會引入用戶的概念,即支持用戶名、密碼。
資源 資源,需要保護的對象,在RocketMQ中,消息發送涉及的Topic、消息消費涉及的消費組,應該進行保護,故可以抽象成資源。
權限 針對資源,能進行的操作,
角色 RocketMQ中,只定義兩種角色:是否是管理員。
另外,RocketMQ還支持按照客戶端IP進行白名單設置。
在講解如何使用ACL之前,我們先簡單看一下RocketMQ ACL的請求流程:
對于上述具體的實現,將在后續文章中重點講解,本文的目的只是希望給讀者一個大概的了解。
acl默認的配置文件名:plain_acl.yml,需要放在${ROCKETMQ_HOME}/store/config目錄下。下面對其配置項一一介紹。
全局白名單,其類型為數組,即支持多個配置。其支持的配置格式如下:
空 表示不設置白名單,該條規則默認返回false。
"*" 表示全部匹配,該條規則直接返回true,將會阻斷其他規則的判斷,請慎重使用。
192.168.0.{100,101} 多地址配置模式,ip地址的最后一組,使用{},大括號中多個ip地址,用英文逗號(,)隔開。
192.168.1.100,192.168.2.100 直接使用,分隔,配置多個ip地址。
192.168.*.或192.168.100-200.10-20 每個IP段使用 "" 或"-"表示范圍。
配置用戶信息,該類型為數組類型。擁有accessKey、secretKey、whiteRemoteAddress、admin、defaultTopicPerm、defaultGroupPerm、topicPerms、groupPerms子元素。
登錄用戶名,長度必須大于6個字符。
登錄密碼。長度必須大于6個字符。
用戶級別的IP地址白名單。其類型為一個字符串,其配置規則與globalWhiteRemoteAddresses,但只能配置一條規則。
boolean類型,設置是否是admin。如下權限只有admin=true時才有權限執行。
UPDATE_AND_CREATE_TOPIC 更新或創建主題。
UPDATE_BROKER_CONFIG 更新Broker配置。
DELETE_TOPIC_IN_BROKER 刪除主題。
UPDATE_AND_CREATE_SUBSCRIPTIONGROUP 更新或創建訂閱組信息。
DELETE_SUBSCRIPTIONGROUP 刪除訂閱組信息。
默認topic權限。該值默認為DENY(拒絕)。
默認消費組權限,該值默認為DENY(拒絕),建議值為SUB。
設置topic的權限。其類型為數組,其可選擇值在下節介紹。
設置消費組的權限。其類型為數組,其可選擇值在下節介紹。可以為每一消費組配置不一樣的權限。
DENY 拒絕。
PUB 擁有發送權限。
SUB 擁有訂閱權限。
上面定義了全局白名單、用戶級別的白名單,用戶級別的權限,為了更好的配置ACL權限規則,下面給出權限匹配邏輯。
首先,需要在broker.conf文件中,增加參數aclEnable=true。并拷貝distribution/conf/plain_acl.yml文件到${ROCKETMQ_HOME}/conf目錄。
broker.conf的配置文件如下:
brokerClusterName = DefaultCluster brokerName = broker-b brokerId = 0 deleteWhen = 04 fileReservedTime = 48 brokerRole = ASYNC_MASTER flushDiskType = ASYNC_FLUSH listenPort=10915 storePathRootDir=E:/SH2019/tmp/rocketmq_home/rocketmq4.5MB/store storePathCommitLog=E:/SH2019/tmp/rocketmq_home/rocketmq4.5MB/store/commitlog namesrvAddr=127.0.0.1:9876 autoCreateTopicEnable=false aclEnable=true
plain_acl.yml文件內容如下:
globalWhiteRemoteAddresses: accounts: - accessKey: RocketMQ secretKey: 12345678 whiteRemoteAddress: admin: false defaultTopicPerm: DENY defaultGroupPerm: SUB topicPerms: - TopicTest=PUB groupPerms: # the group should convert to retry topic - oms_consumer_group=DENY - accessKey: admin secretKey: 12345678 whiteRemoteAddress: # if it is admin, it could access all resources admin: true
從上面的配置可知,用戶RocketMQ只能發送TopicTest的消息,其他topic無權限發送;拒絕oms_consumer_group消費組的消息消費,其他消費組默認可消費。
public class AclProducer { public static void main(String[] args) throws MQClientException, InterruptedException { DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name", getAclRPCHook()); producer.setNamesrvAddr("127.0.0.1:9876"); producer.start(); for (int i = 0; i < 1; i++) { try { Message msg = new Message("TopicTest3" ,"TagA" , ("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET)); SendResult sendResult = producer.send(msg); System.out.printf("%s%n", sendResult); } catch (Exception e) { e.printStackTrace(); Thread.sleep(1000); } } producer.shutdown(); } static RPCHook getAclRPCHook() { return new AclClientRPCHook(new SessionCredentials("rocketmq","12345678")); } }
運行效果如圖所示:
public class AclConsumer { public static void main(String[] args) throws InterruptedException, MQClientException { DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name_4", getAclRPCHook(),new AllocateMessageQueueAveragely()); consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET); consumer.subscribe("TopicTest", "*"); consumer.setNamesrvAddr("127.0.0.1:9876"); consumer.registerMessageListener(new MessageListenerConcurrently() { [@Override](https://my.oschina.net/u/1162528) public ConsumeConcurrentlyStatus consumeMessage(List<messageext> msgs, ConsumeConcurrentlyContext context) { System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), msgs); return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; } }); consumer.start(); System.out.printf("Consumer Started.%n"); } static RPCHook getAclRPCHook() { return new AclClientRPCHook(new SessionCredentials("rocketmq","12345678")); } }
發現并不沒有消費消息,符合預期。
到此,關于“RocketMQ ACL的原理和使用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。