ActiveMQ 如何为单个队列(queue)和主题(topic)配置独立访问权限
Apache ActiveMQ 单队列/单主题细粒度访问权限配置方案
1. 基础认证插件配置(权限控制前置依赖)
首先需要在conf/activemq.xml的<broker>标签内配置基础账号密码及用户分组,这是细粒度权限分配的基础:
<plugins> <!-- 基础认证插件:配置用户、密码、所属用户组 --> <simpleAuthenticationPlugin> <users> <authenticationUser username="prod_order_sender" password="send123" groups="order_sender_group"/> <authenticationUser username="prod_order_receiver" password="recv123" groups="order_receiver_group"/> <authenticationUser username="admin" password="admin123" groups="admin_group"/> </users> </simpleAuthenticationPlugin> </plugins>
示例中分别创建了消息发送方、消息接收方、管理员三类账号,分属不同用户组,可根据实际业务调整账号、密码、分组规则。
2. 授权插件配置(单队列/单主题权限控制)
在上述同一个<plugins>标签内,追加授权插件配置,支持针对单个队列、单个主题分别配置三类权限:
- 读权限(read):可消费消息、查看队列深度
- 写权限(write):可发送消息到对应目的地
- 管理权限(admin):可创建/删除目的地、绑定持久化订阅等
<!-- 细粒度目的地授权插件 --> <authorizationPlugin> <map> <authorizationMap> <authorizationEntries> <!-- 单个队列配置:针对名为order.push.queue的队列单独分配权限 --> <authorizationEntry queue="order.push.queue" read="order_receiver_group,admin_group" write="order_sender_group,admin_group" admin="admin_group"/> <!-- 通配符批量配置:匹配所有order开头的队列 --> <authorizationEntry queue="order.>" read="order_receiver_group,admin_group" write="order_sender_group,admin_group" admin="admin_group"/> <!-- 默认队列权限:未匹配到上述规则的队列走该配置 --> <authorizationEntry queue=">" read="admin_group" write="admin_group" admin="admin_group"/> <!-- 单个主题配置:针对名为order.status.topic的主题单独分配权限 --> <authorizationEntry topic="order.status.topic" read="order_receiver_group,admin_group" write="order_sender_group,admin_group" admin="admin_group"/> <!-- 通配符批量配置:匹配所有order开头的主题 --> <authorizationEntry topic="order.>" read="order_receiver_group,admin_group" write="order_sender_group,admin_group" admin="admin_group"/> <!-- 默认主题权限:未匹配到上述规则的主题走该配置 --> <authorizationEntry topic=">" read="admin_group" write="admin_group" admin="admin_group"/> <!-- 临时目的地权限:Java客户端部分场景会自动创建临时队列/主题,按需配置 --> <authorizationEntry tempQueue=">" read="order_sender_group,order_receiver_group,admin_group" write="order_sender_group,order_receiver_group,admin_group" admin="admin_group"/> <authorizationEntry tempTopic=">" read="order_sender_group,order_receiver_group,admin_group" write="order_sender_group,order_receiver_group,admin_group" admin="admin_group"/> </authorizationEntries> </authorizationMap> </map> </authorizationPlugin>
3. Java客户端适配说明
不需要修改业务逻辑,仅需要在创建JMS连接时传入对应账号密码即可,服务端会自动校验权限:
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://activemq服务地址:61616"); // 传入对应业务账号密码即可 Connection connection = factory.createConnection("prod_order_sender", "send123"); connection.start();
若账号无对应目的地的访问权限,客户端会抛出javax.jms.JMSException: User xxx is not authorized to xxx类异常。
注意事项
- 权限匹配优先级为精准匹配 > 通配符匹配 > 默认规则,配置时需注意规则顺序
- 通配符
>表示匹配该层级及以下所有层级,.是层级分隔符,*表示匹配单个层级 - 该配置仅针对Java客户端JMS访问权限,和Web控制台权限完全独立,不会互相影响
内容的提问来源于stack exchange,提问作者mmo
相关产品推荐
相关产品推荐

