EMQ开源版的MYSQL认证是免费的
重要的事情说三遍EMQX MYSQL认证插件是
免费的
免费的
免费的
1.配置EMQ MYSQL
首先我们要配置emq里的mysql.conf才可以使用MYSQL认证插件
如果是压缩包方法安装的话,就只需要找到我们解压出来的emqx/etc/plugins/emqx_auth_mysql.conf。
这里有一份官方给出的MYSQL认证数据库表参考
DROP TABLE IF EXISTS `mqtt_acl`;
CREATE TABLE `mqtt_acl` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`allow` int(1) DEFAULT NULL COMMENT '0: deny, 1: allow',
`ipaddr` varchar(60) DEFAULT NULL COMMENT 'IpAddress',
`username` varchar(100) DEFAULT NULL COMMENT 'Username',
`clientid` varchar(100) DEFAULT NULL COMMENT 'ClientId',
`access` int(2) NOT NULL COMMENT '1: subscribe, 2: publish, 3: pubsub',
`topic` varchar(100) NOT NULL DEFAULT '' COMMENT 'Topic Filter',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
LOCK TABLES `mqtt_acl` WRITE;
INSERT INTO `mqtt_acl` (`id`, `allow`, `ipaddr`, `username`, `clientid`, `access`, `topic`)
VALUES
(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/#');
UNLOCK TABLES;
DROP TABLE IF EXISTS `mqtt_user`;
CREATE TABLE `mqtt_user` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(100) DEFAULT NULL,
`password` varchar(100) DEFAULT NULL,
`salt` varchar(35) DEFAULT NULL,
`is_superuser` tinyint(1) DEFAULT 0,
`created` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `mqtt_username` (`username`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
配置完了之后就可以启动MYSQL认证了,登录18083端口的仪表盘。
启动成功就说明我们的MYSQL配置成功。
没有成功的原因可能有以下:
1.auth.mysql.username和auth.mysql.password 这两个配置字段前面的#号没去掉。
2.URL地址错误
3.3306数据库端口没有开
4.防火墙 或者云服务器安全组
2.测试连接认证
在数据库的mqtt_user中添加一条数据
然后我们使用官方的MQTTX工具测试连接
测试连接
为什么会这样呢,照常说应该是可以的呀,看回emqx_auth_mysql.conf。
可以看到这里的密码加密方式是sha256,说明我们连接时候的密码是加密后才与数据库内的password字段的值做匹配
这里我们可以改成plain明文不加密,又或者我们可以把数据库的字段改成sha256加密后的字段
这里我选择改成plain不加密
重启一下mysql认证插件。
3.测试ACL权限控制
来到ACL权限控制,使用到数据库mqtt_acl数据表。这里引用
官方文档关于表内字段的说明
规则表字段说明:
allow:禁止(0),允许(1)
ipaddr:设置 IP 地址
username:连接客户端的用户名,此处的值如果设置为 $all 表示该规则适用于所有的用户
clientid:连接客户端的 Client ID
access:允许的操作:订阅(1),发布(2),订阅发布都可以(3)
topic:控制的主题,可以使用通配符,并且可以在主题中加入占位符来匹配客户端信息,例如 t/%c 则在匹配时主题将会替换为当前客户端的 Client ID
%u:用户名
%c:Client ID
我们想限制一个叫admin的用户只能订阅123/#的主题,应该怎么做呢
1.我们在数据表添加一个数据
这条数据可以解读为:我们要允许admin用户订阅123/#的主题
连接上之后我们发现 admin用户 可以关注随便一个主题
这里就是存在误解的地方
ACL认证在遍历时是按照顺序来做遍历的,我这里设置为允许他订阅,实际上相当于没有设置。他的关系图如下。
我们应该是先把admin用户所有的订阅关上,再打开admin用户的123/#主题订阅权限。
关系图应该是像下图一样
那么我们在数据表订阅123/#之前添加一个关闭的语句
这样就完成了admin用户只能订阅123/#的主题的要求
**
有遇到问题可以私信,24小时内必回
**