Mnesia ACL

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

插件:

  1. emqx_auth_mnesia

认证规则

Mnesia 认证默认使用客户端的 Username 和密码进行认证, 可在可在 etc/plugins/emqx_auth_mnesia.conf 中更改为使用客户端的 Client ID 与密码认证:

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

ACL 规则数据

  1. ## 格式
  2. -record(emqx_acl, {
  3. login,
  4. topic,
  5. action,
  6. allow
  7. }).
  8. ## 结构
  9. #emqx_acl{
  10. login = emqx,
  11. topic = Topic/A,
  12. action = pub,
  13. allow = true
  14. }

Mnesia ACL 一条规则中定义了发布、订阅或发布/订阅的信息,在规则中的都是允许列表。

规则字段说明:

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

Mnesia ACL 默认没有任何配置的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. "code": 0,
  6. "data": ["emqx","emqx_1","emqx_2"]
  7. }

查看指定 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 定义:

  1. # Request
  2. # 请注意 ${topic} 需要使用 UrlEncode 编码
  3. DELETE api/v4/emqx_acl/${login}/${topic}
  4. # Response
  5. {
  6. "code": 0
  7. }