客户端授权
客户端通过认证后,FlowMQ 对其发布、订阅、消费等每一次操作执行授权校验,仅放行策略允许的操作。
授权采用基于策略(Policy)的模型:每条策略声明哪些主体(principals,即通过认证确立的身份)可以对哪些资源执行哪些操作,以及允许还是拒绝。显式拒绝(DENY)始终优先于允许(ALLOW)。授权能力在所有计划上均可用,授权配置与策略按项目隔离,各项目互不影响。
授权在 Dashboard 的 Authorization(授权)页面管理:开启授权、创建与管理策略。
启用授权
在 Authorization 页面的授权配置区设置两项,再点击保存配置:
| 配置项 | 说明 |
|---|---|
| 执行授权策略 | 是否执行策略校验。关闭时仍可管理策略,但所有请求不经校验直接放行。默认关闭,确保开箱即用。 |
| 未匹配行为 | 未命中任何策略的请求如何处理:拒绝未匹配请求(安全默认)或允许未匹配请求。 |
配置即时生效并持久化,无需重启。
TIP
对未配置认证器(匿名接入)的协议,若开启了执行授权策略且未匹配行为为拒绝,则没有匹配策略时所有操作都会被拒绝。此时应将未匹配行为设为允许,或显式编写一条允许匿名主体的策略。
创建策略
在 Authorization 页面点击添加策略进入创建向导,依次完成四步:基本信息、资源、操作、预览。
基本信息
填写策略的基本属性,并选择它对哪些主体生效。
- 策略名称:唯一标识,用于后续查看与管理。
- 描述:可选备注。
- 效果:**允许(ALLOW)授予访问,或拒绝(DENY)**阻止访问。
- 主体:选择本策略对谁生效。
- 所有主体:适用于所有人。
- 指定主体:按条件匹配,可组合以下维度(维度之间为“且”,留空的维度不设限):
- 主体 ID:每行一个,支持通配符(glob)。
- 认证器:每行一个,格式
类型:名称(如password:builtin),用于“仅对某认证器认证的主体生效”。 - 属性:键 + 值(值以逗号分隔)。多个属性之间为“且”,同一属性的多个值之间为“或”;属性来自密码用户或 Webhook 认证时下发。
资源
添加一个或多个资源,声明策略适用于哪些资源。每个资源由资源类型、匹配模式、资源模式组成。
资源类型沿用各协议自身的术语:
| 资源类型 | 对应协议 | 含义 |
|---|---|---|
| 主题(topic) | MQTT | MQTT 主题 |
| 流(stream) | Kafka | Kafka 主题 |
| 队列(queue) | AMQP | AMQP 队列 |
| 交换机(exchange) | AMQP | AMQP 交换机 |
| 消费者组(consumer-group) | Kafka | Kafka 消费组 |
INFO
目前授权校验在 MQTT、Kafka 的发布/订阅/消费路径上强制执行;队列、交换机、消费者组等资源类型已纳入模型,对应的策略执行将逐步完善。
匹配模式决定资源模式如何匹配请求的资源名。多数策略使用过滤器;仅当需要精确匹配资源名(+、# 视为普通字符)时才选择精确。
过滤器(filter,默认):作为主题过滤器解释,
+、#按 MQTT 通配规则展开,并支持下方占位符。对允许策略,过滤器需完整覆盖请求范围才放行;对拒绝策略,只要与请求有交集即拦截。例如:允许 + 过滤器 foo/+不放行订阅foo/#:foo/#还能命中foo/a/b,超出foo/+的范围。拒绝 + 过滤器 secret/#会拦截订阅#:两者有交集。
精确(literal):把资源模式当作普通字符串精确匹配,
+、#视为字面字符。常用于精确禁止某个过宽的订阅,例如放行foo/子树、同时禁止一次性订阅整棵子树:允许 过滤器 foo/# 拒绝 精确 foo/#此时可订阅
foo/+、foo/bar等,而订阅foo/#被精确拦截(显式拒绝优先)。
资源模式中可使用占位符,在裁决时按当次连接展开,从而用一条策略表达“每个用户只能访问以自己命名的资源”这类规则:
| 占位符 | 含义 |
|---|---|
${principal.id} | 主体标识(认证得到的身份 ID) |
${principal.authenticator} | 通过认证的认证器名称 |
${principal.authenticatorType} | 认证器类型(如 password、webhook) |
${principal.attributes.<名称>} | 主体属性中的指定项(如 Webhook 下发的属性) |
${connection.clientId} | 协议层客户端标识 |
${connection.sourceIP} | 客户端 IP |
${connection.protocol} | 协议名 |
例如资源模式填 user/${principal.id}/#,可让每个主体只能访问以自身 ID 为前缀的资源。取不到的占位符展开为空串。
TIP
共享订阅按其底层主题过滤器授权,与普通订阅一致。
操作
选择本策略控制的操作:勾选所有操作,或选择具体操作。
| 操作 | 说明 |
|---|---|
| 所有操作(ALL) | 匹配所有操作 |
| 写入(WRITE) | 写入 / 生产(发布、Produce) |
| 读取(READ) | 读取 / 消费(订阅、Fetch) |
| 创建(CREATE) | 创建资源 |
| 删除(DELETE) | 删除资源 |
| 查看(DESCRIBE) | 查看元数据 |
| 修改(ALTER) | 修改配置 |
| 列表(LIST) | 列出资源 |
各协议操作映射示例:MQTT 发布 → 主题 / 写入;MQTT 订阅 → 主题 / 读取;Kafka 生产 → 流 / 写入;Kafka 消费 → 流 / 读取;Kafka 创建、删除主题 → 流 / 创建、删除。
预览
在预览步骤核对效果、主体、资源与操作,确认无误后点击创建策略。策略即时生效,无需重启。
决策流程
对每一次操作,FlowMQ 按如下顺序裁决:
- 若未开启执行授权策略,直接放行。
- 在匹配该主体与资源的策略中,只要存在一条拒绝(DENY),立即拒绝(显式拒绝优先)。
- 若存在匹配的**允许(ALLOW)**策略,则放行。
- 没有任何策略匹配时,按未匹配行为裁决:拒绝或放行。
管理策略
在 Authorization 页面的策略列表中可以查看、编辑、复制、启用 / 禁用和删除策略;每条策略均可单独启用或禁用而无需删除。授权配置与策略均按项目隔离,切换项目即查看与管理对应的规则。
跨协议资源语义
授权资源按协议独立:MQTT 使用主题,Kafka 使用流,二者互不影响。跨协议互通通过主题过滤器绑定配置,不共享授权资源。