Skip to content

内置数据库

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

前置准备

熟悉 EMQX 授权基本概念

通过 Dashboard 配置

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

通过配置文件配置

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

代码示例:

hcl
{
    type = built_in_database
    enable = true
}

其中

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

配置授权检查规则

您可通过 Dashboard 或 API 创建和管理授权规则。

通过 Dashboard 添加授权规则

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

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

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

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

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

通过 API 创建授权规则

您可通过 /api/v5/authorization/sources/built_in_database API 创建以及管理内置数据库后端的授权规则。以下为操作步骤:

步骤 1:获取认证 Token

你需要先通过 EMQX Dashboard 登录认证,以获取 API 访问所需的 Token:

bash
export EMQX_TOKEN=$(curl --silent -X 'POST' "http://localhost:18083/api/v5/login" \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"username": "admin","password": "public"}' | jq -r ".token")

步骤 2:创建内置数据库授权源

bash
curl -X 'POST' \
  'http://localhost:18083/api/v5/authorization/sources' \
  -H "Authorization: Bearer $EMQX_TOKEN" \
  -H 'Accept: */*' \
  -H 'Content-Type: application/json' \
  -d '{
        "enable": true,
        "max_rules": 100,
        "type": "built_in_database"
  }'

步骤 3:创建授权规则

你可以为以下对象创建规则:

  • 指定 client ID 的客户端

    curl -X 'POST' \
      'http://localhost:18083/api/v5/authorization/sources/built_in_database/rules/clients' \
      -H "Authorization: Bearer $EMQX_TOKEN" \
      -H 'Accept: */*' \
      -H 'Content-Type: application/json' \
      -d '[
      {
        "clientid": "client1",
        "rules": [
          {
            "action": "publish",
            "permission": "allow",
            "topic": "test/topic/1"
          },
          {
            "action": "subscribe",
            "permission": "allow",
            "topic": "test/topic/2"
          },
          {
            "action": "all",
            "permission": "deny",
            "topic": "eq test/#"
          }
        ]
      }
    ]'
  • 指定用户名的客户端

    bash
    curl -X 'POST' \
      'http://localhost:18083/api/v5/authorization/sources/built_in_database/rules/users' \
      -H "Authorization: Bearer $EMQX_TOKEN" \
      -H 'Accept: */*' \
      -H 'Content-Type: application/json' \
      -d '[
      {
        "username": "user1",
        "rules": [
          {
            "action": "publish",
            "permission": "allow",
            "topic": "test/topic/1"
          },
          {
            "action": "subscribe",
            "permission": "allow",
            "topic": "test/topic/2"
          },
          {
            "action": "all",
            "permission": "deny",
            "topic": "eq test/#"
          }
        ]
      }
    ]'
  • 所有客户端(全局规则)

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

每条规则包括以下字段:

  • permission:是否允许该操作,可选值为 allowdeny
  • action:操作类型,可选值为 publishsubscribeall
  • topic:该规则适用的主题过滤器,支持使用主题占位符
  • qos(可选) 规则适用的 QoS 等级数组,例如 [0, 1];默认为全部 QoS。
  • retain(可选) 是否适用于保留消息,可选值为 truefalse。默认允许保留消息。