1、MySQL 认证是较为常用到的EMQ认证方式,其可存储大量数据,方便与外部设备管理系统集成。所使用的插件为emqx_auth_mysql注:emqx_auth_mysql 插件同时包含 ACL 功能,可通过注释禁用。
2、配置MySQL 连接信息,在EMQ安装目录下,编辑如下配置文件etc/plugins/emqx_auth_mysql.conf设置数据库连接地址、帐号密码、连接池大小
3、在所配置的数据库中(auth.mysql.database项),创建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=InnoDB DEFAULT CHARSET=utf8mb4;
4、插入一条用户数据,此时启用 MySQL 认证后,可通过用户名: emqx,密码:public 连接EMQ服务端。INSERT INTO `mqtt_user` ( `username`, `password`, `salt`)VALUES('emqx', 'efa1f375d76194fa51a3556a97e641e61685f914d446979da50a551a4333ffd7', NULL);
5、MySQL认证的加盐规则与哈希方法配置,mqtt_user数据表中password字段都是保存密文,以确保信息安全。
6、在数据库中添加ACL 规则表CREATE TABLE `mqtt_acl` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `allow` int(1) DEFAULT 1 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;
7、ACL表配置的示例数据:
8、ACL规则表字段说明:allow:禁止(0),允许(1)ipaddr:设置 IP 地址username:连接客户端的用户名,此处的值如果设置为$all表示该规则适用于所有的用户clientid:连接客户端的 Client IDaccess:允许的操作:订阅(1),发布(2),订阅发布都可以(3)topic:控制的主题,可以使用通配符,并且可以在主题中加入占位符来匹配客户端信息,例如t/%c则在匹配时主题将会替换为当前客户端的 Client ID%u:用户名%c:Client ID