Mnesia ACL

Mnesia ACL 使用 EMQ X 内置的 Mnesia 数据库存储 ACL 规则,可以存储数据、动态管理 ACL,方便与外部设备管理系统集成

插件:

  1. emqx_auth_mnesia

ACL规则

Mnesia ACL 默认基于 MQTT 报文中的 Username 和密码进行权限认证, 可在 etc/plugins/emqx_auth_mnesia.conf 中更改为使用 MQTT 报文的的 Client ID 与密码认证:

  1. ## Auth and ACL base on username or clientid.
  2. ##
  3. ## Value: username | clientid
  4. auth.mnesia.as = username

ACL 规则结构体

  1. {
  2. "login":"emqx",
  3. "topic":"testtopic/1",
  4. "action":"pub",
  5. "allow": true
  6. }

规则字段说明:

  • login:根据 auth.mnesia.as 的值匹配客户端的 Username 或 Client ID.
  • topic:控制的主题,可以使用通配符,并且可以在主题中加入占位符来匹配客户端信息,例如 t/%c 则在匹配时主题将会替换为当前客户端的 Client ID
    • %u:用户名
    • %c:Client ID
  • action:操作行为,可选值:pub | sub | pubsub
  • allow:是否允许

Mnesia ACL 默认不设规则,你可以使用 HTTP API 管理 ACL 规则。

使用 HTTP API 管理 ACL 规则

添加 ACL 规则

API 定义:

  1. # Request
  2. POST api/v4/emqx_acl
  3. {
  4. "login":"emqx",
  5. "topic":"Topic/A",
  6. "action":"pub",
  7. "allow": true
  8. }
  9. # Response
  10. {
  11. "data": {
  12. "emqx": "ok"
  13. },
  14. "code": 0
  15. }

批量添加 ACL 规则

API 定义:

  1. # Request
  2. POST api/v4/emqx_acl
  3. [
  4. {
  5. "login":"emqx_1",
  6. "topic":"Topic/A",
  7. "action":"pub",
  8. "allow": true
  9. },
  10. {
  11. "login":"emqx_2",
  12. "topic":"Topic/A",
  13. "action":"pub",
  14. "allow": true
  15. }
  16. ]
  17. # Response
  18. {
  19. "data": {
  20. "emqx_2": "ok",
  21. "emqx_1": "ok"
  22. },
  23. "code": 0
  24. }

查看已经添加的 ACL 规则

API 定义:

  1. # Request
  2. GET api/v4/emqx_acl
  3. # Response
  4. {
  5. "meta": {
  6. "page": 1,
  7. "limit": 10,
  8. "count": 1
  9. },
  10. "data": [
  11. {
  12. "topic": "Topic/A",
  13. "login": "emqx",
  14. "action": "pub"
  15. }
  16. ],
  17. "code": 0
  18. }

查看指定 ACL 规则

API 定义:

  1. # Request
  2. GET api/v4/emqx_acl/${login}
  3. # Response
  4. {
  5. "data": {
  6. "topic": "Topic/A",
  7. "login": "emqx",
  8. "allow": true,
  9. "action": "pub"
  10. },
  11. "code": 0
  12. }

删除 ACL 规则

删除指定 ACL 规则:

API 定义:

```bash

Request

请注意 ${topic} 需要使用 UrlEncode 编码

DELETE api/v4/emqx_acl/${login}/${topic}

Response

{ “code”: 0 } ```