Skip to content

内置数据库

EMQX 通过内置数据库为用户提供了一种低成本、开箱即用的授权规则存储方式。您可以通过 Dashboard 或配置文件设置使用内置数据库作为数据源,通过 Dashboard 或 HTTP API 添加相关授权检查规则。

前置准备

熟悉 EMQX 授权基本概念

通过 Dashboard 配置

EMQX Dashboard 页面,点击左侧导航栏的 访问控制 -> 授权,在 授权 页面,添加 Built-in Database 作为 数据源, 点击下一步进入配置参数页签。由于无需配置其他参数,可直接点击 创建 完成配置。

通过配置文件配置

您也可通过配置文件中的 authorization 字段配置通过 EMQX 内置数据库存储授权规则。

代码示例:

hcl
{
    type = built_in_database
    enable = true
}

其中

  • type:授权检查器的数据源类型,此处填入 built_in_database
  • enable:是否激活该检查器,可选值:truefalse

配置授权检查规则

您可通过 Dashboard 或 API 传入授权规则。

通过 Dashboard 配置

在 Dashboard 的 授权 页面,点击 Built-in Database 数据源对应的 **操作 **栏下的 权限管理,即可进行授权检查规则的配置。

您可根据需要从客户端 ID、用户名或直接从主题角度设置授权检查。

  • 客户端 ID:见 客户端 ID 页签,指定适用此条规则的客户端
  • 用户名:见 用户名 页签,指定适用此条规则的用户名
  • 权限:是否允许当前客户端/用户的某类操作请求;可选值:允许拒绝
  • 操作:配置该条规则对应的操作;可选值:发布订阅发布与订阅
  • 主题:配置该条规则对应的主题

EMQX 支持针对单个客户端或用户配置多条授权检查规则,您可通过页面的 上移下移 调整不同规则的执行顺序和优先级。

如希望同时针对多个客户端或用户配置授权检查规则,可通过 HTTP API 传入相关配置。

通过 API 配置

您可通过 API 传入以及管理授权规则:

  • 指定适用此条规则的客户端:
    • /api/v5/authorization/sources/built_in_database/clientid
  • 指定适用此条规则的用户名:
    • /api/v5/authorization/sources/built_in_database/username
  • 指定适用此条规则的主题:
    • /api/v5/authorization/sources/built_in_database/all

比如我们可通过如下代码针对 client1 客户端创建授权规则:

bash
curl -X 'POST' \
  'http://localhost:18083/api/v5/authorization/sources/built_in_database/clientid' \
  -H 'accept: */*' \
  -H 'Content-Type: application/json' \
  -d '[
  {
    "clientid": "client1",
    "rules": [
      {
        "action": "publish",
        "permission": "allow",
        "topic": "test/toopic/1"
      },
      {
        "action": "subscribe",
        "permission": "allow",
        "topic": "test/toopic/2"
      },
      {
        "action": "all",
        "permission": "deny",
        "topic": "eq test/#"
      }
    ]
  }
]'

每条规则应包括如下信息:

  • permission:是否允许当前客户端/用户的某类操作请求;可选值:allowdeny
  • action:配置该条规则对应的操作;可选值: publishsubscribeall
  • topic:配置该条规则对应的主题,支持主题占位符
  • qos: (可选) 使用数字数组指定规则适用的消息 QoS,如 [0, 1][1, 2]。默认为全部 QoS。
  • retain: (可选)用于指定当前规则是否支持发布保留消息,可选值有 truefalse,默认允许保留消息。