用户与权限管理
RabbitMQ 通过用户认证与虚拟主机权限控制实现多租户隔离,生产环境必须为不同业务分配独立账号。
定义
RabbitMQ 权限体系包含两层:用户认证(用户名/密码)与虚拟主机权限(configure/write/read 权限)。用户必须被授权访问特定虚拟主机才能创建队列、发送/消费消息。
命令行操作
创建用户
Bash
# 格式: rabbitmqctl add_user <username> <password>
rabbitmqctl add_user app_user SecurePass123
设置用户角色
Bash
# 可选角色: administrator, monitoring, policymaker, management, 普通用户(空)
rabbitmqctl set_user_tags app_user management
角色说明:
administrator:最高权限,可管理所有虚拟主机、用户、策略management:可访问 Web 控制台,仅能查看自己有权访问的资源monitoring:可查看监控指标,无管理权限policymaker:可管理策略和参数- 无角色:仅用于业务连接,无法访问控制台
授权虚拟主机权限
Bash
# 格式: rabbitmqctl set_permissions -p <vhost> <user> <configure> <write> <read>
# 授予 app_user 访问 /vhost_app 的完整权限
rabbitmqctl set_permissions -p /vhost_app app_user ".*" ".*" ".*"
权限正则说明:
configure:允许创建/删除队列、交换机(正则匹配资源名称)write:允许发布消息read:允许消费消息、查看队列状态
查看用户权限
Bash
# 列出所有用户
rabbitmqctl list_users
# 查看指定用户在虚拟主机上的权限
rabbitmqctl list_permissions -p /vhost_app
# 查看用户有权访问的虚拟主机
rabbitmqctl list_user_permissions app_user
Java 客户端连接示例
Java
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class AuthenticatedConnection {
private static final String VHOST = "/vhost_app";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setPort(5672);
// 使用新建的业务账号连接
factory.setUsername("app_user");
factory.setPassword("SecurePass123");
// 指定虚拟主机
factory.setVirtualHost(VHOST);
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
System.out.println("认证成功,已连接到虚拟主机: " + VHOST);
// 在该虚拟主机下创建队列
channel.queueDeclare("business_queue", true, false, false, null);
System.out.println("队列已创建: business_queue");
}
}
}
Web 控制台操作
- 登录
http://localhost:15672(使用 administrator 角色) - 点击顶部 Admin 标签
- 点击 Add a user,填写用户名、密码、角色
- 点击用户进入详情页,在 Permissions 区域点击 Set permission
- 选择虚拟主机,填写 configure/write/read 正则表达式,点击设置
删除用户与撤销权限
Bash
# 撤销用户在虚拟主机上的权限
rabbitmqctl clear_permissions -p /vhost_app app_user
# 删除用户
rabbitmqctl delete_user app_user
注意事项
guest 用户仅限 localhost 连接,远程访问必须新建用户。
configure/write/read 权限使用正则表达式匹配资源名称,
".*"表示匹配所有资源。
修改权限后需重新连接才能生效,已建立的连接不受影响。
生产环境建议为每个业务分配独立用户和虚拟主机,实现权限最小化。
要点总结
- 创建用户:
rabbitmqctl add_user <username> <password> - 设置角色:
rabbitmqctl set_user_tags <user> <role>,常用 management 或 administrator - 授权虚拟主机:
rabbitmqctl set_permissions -p <vhost> <user> ".*" ".*" ".*" - Java 连接需设置
setUsername、setPassword、setVirtualHost - 权限基于虚拟主机隔离,不同虚拟主机用户互不干扰
📝 发现内容有误?点击此处直接编辑