在阅读该教程之前,假定你已经了解 MQTT、MQTT 5 以及 EMQ X 的简单知识 。
【基于 MySQL 的 EMQ X Auth & ACL】emqx-auth-MySQL 它通过检查每个终端接入的 username 和 password 是否与用户指定 的 MySQL 数据库中存储的信息一致来实现对终端的访问控制 。其功能逻辑如下:

文章插图
本文假设 MySQL 已经安装在您的机器上,并且您可以连接到 MySQL 服务器 。注:EMQ X 开源版至 v3.1-beta.2 为止,尚不支持 MySQL 8.0,因此以下内容仅适用于 MySQL 5.7 及以下版本 。
$ mysql --versionmysql Ver 14.14 Distrib 5.7.25, for macos10.14 (x86_64) using EditLine wrApper插件配置项说明

文章插图
mqtt.sql
emqx-auth-mysql 提供了 mqtt.sql 文件帮助用户快速创建数据表以及导入默认数据 。mqtt.sql 将会为 mqtt_acl 数据表导入以下默认规则:
mysql> select * from mqtt_acl;+----+-------+-----------+-----------+----------+--------+--------+| id | allow | ipaddr | username | clientid | access | topic |+----+-------+-----------+-----------+----------+--------+--------+| 1 | 1 | NULL | $all | NULL | 2 | # || 2 | 0 | NULL | $all | NULL | 1 | $SYS/# || 3 | 0 | NULL | $all | NULL | 1 | eq # || 4 | 1 | 127.0.0.1 | NULL | NULL | 2 | $SYS/# || 5 | 1 | 127.0.0.1 | NULL | NULL | 2 | # || 6 | 1 | NULL | dashboard | NULL | 1 | $SYS/# |+----+-------+-----------+-----------+----------+--------+--------+6 rows in set (0.00 sec)allow - 1: allow; 0: deny
access - 1: subscribe; 2: publish; 3: publish and subscribe
以上规则分别表示:
- 允许任何用户发布除以 '$' 字符开头以外的任何主题的消息
- 拒绝任何用户订阅任何以 "$SYS/" 开头的主题
- 拒绝任何用户订阅 "#" 主题
- 允许本机用户发布任何以 "$SYS/" 开头的主题
- 允许本机用户发布发布除以 '$' 字符开头以外的任何主题的消息
- 允许 dashboard 用户订阅任何以 "$SYS/" 开头的主题
除此之外,用户可以导入自定义的 ACL 规则 。
Auth 与 ACL 功能验证
- Mac 环境安装 mosquitto
- brew install mosquitto
- 创建数据库,导入数据
- mqtt.sql 路径可根据实际情况自行改动
mysql> create database mqtt;mysql> use mqtt;mysql> source ./emqx_auth_mysql/mqtt.sqlmysql> insert into mqtt_user (id, is_superuser, username, password, salt) -> values (1, false, 'test', 'password', 'salt');mysql> insert into mqtt_acl (id, allow, ipaddr, username, clientid, access, topic) -> values (7, 0, NULL, 'test', NULL, 1, 'mytopic');mysql> exit;
- 修改配置文件
- 禁止匿名访问:
## .../etc/emqx.confallow_anonymous = false
- 配置数据库中密码的加密方式为 plain,即不加密:
## .../etc/plugins/emqx_auth_mysql.confauth.mysql.password_hash = plain
- 配置要访问的数据库以及用户名密码:
## .../etc/plugins/emqx_auth_mysql.confauth.mysql.username = rootauth.mysql.password = publicauth.mysql.database = mqtt
- 启动 EMQ X 与 emqx-auth-mysql
$ ./_rel/emqx/bin/emqx startemqx 3.1 is started successfully!$ ./_rel/emqx/bin/emqx_ctl plugins load emqx_auth_mysql
- 测试
- 使用正确的用户名和密码进行连接,并订阅 "topic" 主题
$ mosquitto_sub -p 1883 -u test -P password -t 'topic' -dClient mosqsub|91114-zhouzibod sending CONNECTClient mosqsub|91114-zhouzibod received CONNACKClient mosqsub|91114-zhouzibod sending SUBSCRIBE (Mid: 1, Topic: topic, QoS: 0)Client mosqsub|91114-zhouzibod received SUBACKSubscribed (mid: 1): 0
- 现象:连接并订阅成功
- 使用错误的用户名或密码进行连接,并订阅 "topic" 主题
$ mosquitto_sub -p 1883 -u bad_user -P password -t 'topic' -dClient mosqsub|91136-zhouzibod sending CONNECTClient mosqsub|91136-zhouzibod received CONNACKConnection Refused: not authorised.
- 现象:连接被拒绝
- 使用正确的用户名和密码进行连接,并订阅 "#" 主题
$ mosquitto_sub -p 1883 -u test -P password -t '#' -dClient mosqsub|11257-zhouzibod sending CONNECTClient mosqsub|11257-zhouzibod received CONNACKClient mosqsub|11257-zhouzibod sending SUBSCRIBE (Mid: 1, Topic: #, QoS: 0)Client mosqsub|11257-zhouzibod received SUBACKSubscribed (mid: 1): 128
- 现象:连接成功,订阅失败,原因码128
- 使用正确的用户名和密码进行连接,并订阅 "mytopic" 主题
$ mosquitto_sub -p 1883 -u test -P password -t 'mytopic' -dClient mosqsub|13606-zhouzibod sending CONNECTClient mosqsub|13606-zhouzibod received CONNACKClient mosqsub|13606-zhouzibod sending SUBSCRIBE (Mid: 1, Topic: mytopic, QoS: 0)Client mosqsub|13606-zhouzibod received SUBACKSubscribed (mid: 1): 128
推荐阅读
-
宝蓝|“南孚组合”被拆散!宝蓝时隔242天再回赛场,DMO被IG三辅助轮换摇晕
-
5g网络|迪拜富豪初次体验中国5G网络,刚一上手就蒙圈了:这就是所谓的5G?
-
|泰达新援引进又赶了个晚集,凑数式引援难解球队当前困局
-
-
青年|大快人心!活了2年的Steam国产垃圾山寨游戏,终于被G胖ban了!
-
-
孔明说车|博越“嫁接版”皮卡到店!网友:自取其辱,吉利设计师真会偷懒
-
鲁班被称木匠鼻祖,为何《鲁班书》却成禁书?网友:堪称葵花宝典
-
证券时报网|创纪录!174亿“聪明资金”撤离,A股应声调整,行情到哪儿了?
-
-
新冠肺炎疫情|大连:停止餐饮服务经营单位聚集性就餐
-
-
|电影《林海雪原》,百鸡宴成八一厂工作餐,土匪黑话是什么意思
-
-
筑垒地域@负责人首次公开任务细节,火星,中国人来了!模拟测试进展顺利
-
#世上现存最年长熊猫迎38岁生日#世上现存最年长熊猫迎38岁生日 相当于人类110-140岁高龄
-
『』世界上最大的蜥蜴——科莫多巨蜥,体长可达3米(性格凶残)
-
观测|真·大彗星来了!未来一周,有可能用肉眼直接看到它
-
#数学#学生党利器!微软出品的这个小众APP,帮你搞定数学难题!
-
智通财经金泰丰国际控股(08479)一季度净亏损139.8万元,盈转亏