Skip to content

访问控制列表 ​

访问控制列表(ACL)提供更细粒度的授权方式。ACL 规则会按自上而下的顺序匹配。一旦某条规则匹配,其权限结果就会生效,后续规则会被忽略。

配置项 ​

NameTypeRequiredDescription
permitenum是权限:allow、deny
actionenum否操作:publish、subscribe、pubsub
topicsArray[String]否Topic 数组
usernameString否用户名:"#" 表示所有用户
clientidString否Client ID:"#" 表示所有 Client ID
andArray[Object]否AND 操作符
orArray[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,该规则会精确匹配。