RabbitMQ如何通过AD组关联特定vhost权限?
利用JWT令牌中的AD组信息实现RabbitMQ VHost与团队的绑定
完全可以通过JWT令牌中的AD组信息实现团队与专属VHost的绑定,核心是通过rabbitmq_auth_backend_oauth2插件的权限映射规则,将JWT里的组(你配置中指定的roles字段)与对应VHost的访问权限关联起来,具体实现步骤如下:
1. 确认JWT令牌的组信息输出
确保你的AD OAuth服务器在颁发的JWT令牌中,将用户所属的团队组信息写入roles字段(你的配置已通过extra_scopes_source: <<"roles">>>指定从该字段读取权限范围)。例如:
- 团队A的用户,JWT的
roles字段包含<<"team-a">> - 团队B的用户,JWT的
roles字段包含<<"team-b">>
2. 调整RabbitMQ OAuth2配置
修改你的Helm Chart advancedConfig中的rabbitmq_auth_backend_oauth2部分,添加scope_to_permissions规则,将AD组映射到对应VHost的权限:
advancedConfig: | [ {rabbit, [ {auth_backends, [rabbit_auth_backend_oauth2, rabbit_auth_backend_internal]} ]}, {rabbitmq_management, [ {oauth_enabled, true}, {oauth_client_id, "<id>"}, {oauth_provider_url, "<url>"} ]}, {rabbitmq_auth_backend_oauth2, [ {resource_server_id, <<"<id>">>}, {extra_scopes_source, <<"roles">>}, % 添加组到VHost权限的映射规则 {scope_to_permissions, [ % 团队A:允许访问/team-a VHost,拥有配置、读写权限 {<<"team-a">>, [ {resource, <<"vhost">>, <<"/team-a">>}, {permission, <<"configure">>}, {permission, <<"write">>}, {permission, <<"read">>} ]}, % 团队B:允许访问/team-b VHost,拥有配置、读写权限 {<<"team-b">>, [ {resource, <<"vhost">>, <<"/team-b">>}, {permission, <<"configure">>}, {permission, <<"write">>}, {permission, <<"read">>} ]} ]}, {key_config, [ {jwks_url, <<"<url>/discovery/v2.0/keys">>} ]} ]} ].
权限说明
configure:允许用户创建/删除队列、交换器等资源write:允许用户发送消息到队列/交换器read:允许用户从队列接收消息
可根据团队需求调整权限项,比如只读团队可只保留read权限。
3. 提前创建对应VHost
确保每个团队的专属VHost已提前创建(OAuth2插件不会自动生成VHost),可通过以下命令创建:
# 创建团队A的VHost rabbitmqctl add_vhost /team-a # 创建团队B的VHost rabbitmqctl add_vhost /team-b
4. 验证效果
- 用户登录后,通过
jwt.io解析令牌,确认roles字段包含对应团队的组名 - 访问RabbitMQ管理界面,用户仅能看到自己团队的VHost,无法访问其他团队的VHost及其中的资源
内容的提问来源于stack exchange,提问作者David S
相关产品推荐
相关产品推荐

