EMQX进行多数据源设备认证

说明

本文介绍 使用EMQX作为 MQTT Server时,如何连接多个数据源(认证链)进行设备认证。

为了使用方便,均使用 docker 启动 EMQX ,并且在启动时配置参数自动进行数据连接。

介绍了 EMQX 中各种环境变量在 docker compose 中的写法。

MySQL认证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
version: '3'
services:
emqx:
image: emqx/emqx:4.3.5
container_name: docker_emqx
ports:
- "18083:18083"
- "1883:1883"
- "4369:4369"
- "8883:8883"
- "8085:8084"
- "8081:8081"
- "8083:8083"
volumes:
- /home/yxin/Documents/emqx/emqx-cert:/opt/emqx/etc/certs
- /home/yxin/Documents/emqx/emqx.conf:/opt/emqx/etc/emqx.conf
restart: always
environment:
- "EMQX_ALLOW_ANONYMOUS=false"
- "EMQX_ACL_NOMATCH=deny"
- "EMQX_AUTH__MYSQL__SERVER=172.16.33.51:3306"
- "EMQX_AUTH__MYSQL__POOL=8"
- "EMQX_AUTH__MYSQL__USERNAME=root"
- "EMQX_AUTH__MYSQL__PASSWORD=MeRootSSSS"
- "EMQX_AUTH__MYSQL__DATABASE=mlic"
- "EMQX_AUTH__MYSQL__AUTH__MYSQL__QUERY_TIMEOUT=5"
- "EMQX_AUTH__MYSQL__AUTH_QUERY=select password from mqtt_user where username = '%u' union all select password from mqtt_user2 where username = '%u' limit 1"
- "EMQX_LOADED_PLUGINS=emqx_recon | emqx_retainer | emqx_rule_engine | emqx_management | emqx_dashboard | emqx_auth_mysql"

其中

1
select password from mqtt_user where username = '%u' union all select password from mqtt_user2 where username = '%u' limit 1"

经测试可用,可在多表中进行设备认证。

PostgreSQL认证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
version: '3'
services:
emqx:
image: emqx/emqx:4.4.15
container_name: docker_emqx
ports:
- "18083:18083"
- "1888:1883"
- "4369:4369"
- "8883:8883"
restart: always
environment:
- "EMQX_ALLOW_ANONYMOUS=false"
- "EMQX_ACL_NOMATCH=deny"
- "EMQX_AUTH__PGSQL__SERVER=172.16.33.58:5432"
- "EMQX_AUTH__PGSQL__POOL=8"
- "EMQX_AUTH__PGSQL__USERNAME=postgres"
- "EMQX_AUTH__PGSQL__PASSWORD=PgSQLmmmmmm"
- "EMQX_AUTH__PGSQL__DATABASE=timescale"
# - "EMQX_AUTH__PGSQL__AUTH__PGSQL__QUERY_TIMEOUT=5"
- "EMQX_LOADED_PLUGINS=emqx_recon | emqx_retainer | emqx_rule_engine | emqx_management | emqx_dashboard | emqx_auth_pgsql"

认证链

可同时使用 MySQL以及Postgresql认证。其中有一个认证通过即认证通过,不过如果两个数据库中有相同用户名,密码不同,当一个认证失败后就会返回认证失败。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
version: '3'
services:
emqx:
image: emqx/emqx:4.4.15
container_name: docker_emqx_auth
ports:
- "18085:18083"
- "1889:1883"
# - "4369:4369"
# - "8883:8883"
restart: always
# 使用host模式会导致emqx启动失败
# network_mode: bridge
# external_links:
# - mysql
environment:
- "EMQX_ALLOW_ANONYMOUS=false"
- "EMQX_ACL_NOMATCH=deny"
- "EMQX_AUTH__PGSQL__SERVER=172.16.33.58:5432"
- "EMQX_AUTH__PGSQL__POOL=8"
- "EMQX_AUTH__PGSQL__USERNAME=postgres"
- "EMQX_AUTH__PGSQL__PASSWORD=JDDDDDDDDt"
- "EMQX_AUTH__PGSQL__DATABASE=timescale"
# - "EMQX_AUTH__PGSQL__AUTH__PGSQL__QUERY_TIMEOUT=5"
- "EMQX_AUTH__MYSQL__SERVER=172.16.33.62:3306"
- "EMQX_AUTH__MYSQL__POOL=8"
- "EMQX_AUTH__MYSQL__USERNAME=root"
- "EMQX_AUTH__MYSQL__PASSWORD=MVVVVVVVVne"
- "EMQX_AUTH__MYSQL__DATABASE=iform"
- "EMQX_AUTH__MYSQL__AUTH__MYSQL__QUERY_TIMEOUT=5"
- "EMQX_LOADED_PLUGINS=emqx_recon | emqx_retainer | emqx_rule_engine | emqx_management | emqx_dashboard | emqx_auth_pgsql | emqx_auth_mysql"
# networks:
# default:
# external:
# name: net-5g