Mnesia 认证

Mnesia 认证使用 EMQ X 内置 Mnesia 数据库存储客户端 Client ID/Username 与密码,支持通过 HTTP API 管理认证数据。

Mnesia 认证不依赖外部数据源,使用上足够简单轻量。

插件:

  1. emqx_auth_mnesia

认证规则

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

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

哈希方法

Mnesia 认证默认使用 sha256 进行密码哈希加密,可在 etc/plugins/emqx_auth_mnesia.conf 中更改:

  1. # etc/plugins/emqx_auth_mnesia.conf
  2. ## Value: plain | md5 | sha | sha256
  3. auth.mnesia.password_hash = sha256

配置哈希方法后,新增的预设认证数据与通过 HTTP API 添加的认证数据将以哈希密文存储在 EMQ X 内置数据库中。

预设认证数据

可以通过配置文件预设认证数据,编辑配置文件:etc/plugins/emqx_auth_mnesia.conf

  1. # etc/plugins/emqx_auth_mnesia.conf
  2. ## 第一组认证数据
  3. auth.mnesia.1.login = admin
  4. auth.mnesia.1.password = public
  5. auth.mnesia.1.is_superuser = true
  6. ## 第二组认证数据
  7. auth.mnesia.2.login = client
  8. auth.mnesia.2.password = public
  9. auth.mnesia.2.is_superuser = false

认证数据中的 login 会根据 auth.mnesia.as 的值去读取客户端的 Username 或 Client ID.

插件启动时将读取预设认证数据并加载到 EMQ X 内置数据库中,节点上的认证数据会在此阶段同步至集群中。

预设认证数据在配置文件中使用了明文密码,出于安全性与可维护性考虑应当避免使用该功能。

预设认证数据无法通过 API 修改、删除,请慎用。

使用 HTTP API 管理认证数据

添加认证数据

API 定义:

  1. # Request
  2. POST api/v4/auth_user
  3. {
  4. "login": "emqx_c",
  5. "password": "emqx_p",
  6. "is_superuser": false
  7. }
  8. # Response
  9. {
  10. "data": {
  11. "emqx_c": "ok"
  12. },
  13. "code": 0
  14. }

使用 POST 请求添加 login 为 emqx_c,password 为 emqx_p,非超级用户的认证信息,返回信息中 code = 0 即为成功。

批量添加认证数据

API 定义:

  1. # Request
  2. POST api/v4/auth_user
  3. [
  4. {
  5. "login": "emqx_c_1",
  6. "password": "emqx_p",
  7. "is_superuser": false
  8. },
  9. {
  10. "login": "emqx_c_2",
  11. "password": "emqx_p",
  12. "is_superuser": false
  13. }
  14. ]
  15. # Response
  16. {
  17. "data": {
  18. "emqx_c_2": "ok",
  19. "emqx_c_1": "ok"
  20. },
  21. "code": 0
  22. }

查看已经添加的认证数据

API 定义:

  1. # Request
  2. GET api/v4/auth_user
  3. # Response
  4. {
  5. "meta": {
  6. "page": 1,
  7. "limit": 10,
  8. "count": 1
  9. },
  10. "data": [
  11. {
  12. "password": "ceb5e917f7930ae8f0dc3ceb496a428f7e644736eebca36a2b8f6bbac756171a",
  13. "login": "emqx_c",
  14. "is_superuser": false
  15. }
  16. ],
  17. "code": 0
  18. }

更改已添加的认证数据

API 定义:

  1. # Request
  2. PUT api/v4/auth_user/${login}
  3. {
  4. "password": "emqx_new_p",
  5. "is_superuser": false
  6. }
  7. # Response
  8. {
  9. "code": 0
  10. }

查看指定的认证数据

注意此处返回的密码是使用配置文件指定哈希方式加密后的密码:

API 定义:

  1. # Request
  2. GET api/v4/auth_user/${login}
  3. # Response
  4. {
  5. "data": {
  6. "password": "3b20ff0218af39d01252844ccaac8ce0160f969ad00c601e23f6e57cd26fad4e",
  7. "login": "emqx_c",
  8. "is_superuser": false
  9. },
  10. "code": 0
  11. }

删除认证数据

删除指定认证数据:

API 定义:

  1. # Request
  2. DELETE api/v4/auth_user/${login}
  3. # Response
  4. {
  5. "code": 0
  6. }