关于EMQX的MYSQL认证插件使用配置心得

  • Post author:
  • Post category:mysql




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小时内必回

**



版权声明:本文为JoshRong原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。