访问控制列表
访问控制列表(ACL)提供更细粒度的授权方式。ACL 规则会按自上而下的顺序匹配。一旦某条规则匹配,其权限结果就会生效,后续规则会被忽略。
配置项
| Name | Type | Required | Description |
|---|---|---|---|
| permit | enum | 是 | 权限:allow、deny |
| action | enum | 否 | 操作:publish、subscribe、pubsub |
| topics | Array[String] | 否 | Topic 数组 |
| username | String | 否 | 用户名:"#" 表示所有用户 |
| clientid | String | 否 | Client ID:"#" 表示所有 Client ID |
| and | Array[Object] | 否 | AND 操作符 |
| or | Array[Object] | 否 | OR 操作符 |
配置示例
以下示例展示如何为不同用户和主题定义访问控制规则,从而灵活管理 MQTT 权限。
要启用访问控制,请以正确格式将规则写入 nanomq_acl.conf 文件,并按照访问控制介绍中的说明在主配置文件 nanomq.conf 中引用该文件:
acl = {include "/etc/nanomq_acl.conf"}ACL 配置示例
bash
rules = [
# Allow MQTT client with username "dashboard" to subscribe to all system topics
{"permit": "allow", "username": "dashboard", "action": "subscribe", "topics": ["$SYS/#"]},
# Deny all users from subscribing to "$SYS/#" and "#" topics
{"permit": "deny", "username": "#", "action": "subscribe", "topics": ["$SYS/#", "#"]},
# Allow all other publish/subscribe operations
{"permit": "allow"}
]提示
@符号可用于比标准通配符更精确地匹配特定主题模式。例如:bash{"permit": "deny", "username": "#", "action": "subscribe", "topics": ["$SYS/#", "@#", "@client/+/msg"]}该规则只会拒绝订阅主题
#和client/+/msg,但不会拒绝client/123/msg这类按 MQTT 通配符规则可匹配的主题。这可以实现更细粒度的控制。可以在主题定义中使用动态占位符
${clientid}和${username},以便在授权检查期间动态匹配客户端相关值。示例:
bash{"permit": "allow", "action": "publish", "topics": ["t/${clientid}"]}如果 Client ID 为
nmq_c的客户端尝试发布到t/nmq_c,该规则会精确匹配。