参考 https://blog.csdn.net/u011142688/article/details/79852325
参考 https://blog.csdn.net/u011142688/article/details/79852306
参考 https://www.jianshu.com/p/65935a753eab
在初始化好mqtt_acl表后,可以在表中配置设备的订阅和发布权限
1: allow; 0: deny
客户端的IP地址
客户端的用户名,如果表示所有用户可以使用$all表示
客户端的clientId
1: subscribe(订阅); 2: publish(发布); 3: publish and subscribe(发布和订阅);
主题字段
“#”:除以 '$' 字符开头以外的任何主题;
"$SYS/#":以 "$SYS/" 开头的主题
“eq #”: "#" 主题
允许任何用户发布除以 '$' 字符开头以外的任何主题的消息
INSERT INTO `mqtt_acl` VALUES ('1', '1', null, '$all', null, '2', '#');
拒绝任何用户订阅任何以 "$SYS/" 开头的主题
INSERT INTO `mqtt_acl` VALUES ('2', '0', null, '$all', null, '1', '$SYS/#');
拒绝任何用户订阅 "#" 主题
INSERT INTO `mqtt_acl` VALUES ('3', '0', null, '$all', null, '1', 'eq #');
允许本机用户发布任何以 "$SYS/" 开头的主题
INSERT INTO `mqtt_acl` VALUES ('5', '1', '127.0.0.1', null, null, '2', '$SYS/#');
允许本机用户发布发布除以 '$' 字符开头以外的任何主题的消息
INSERT INTO `mqtt_acl` VALUES ('6', '1', '127.0.0.1', null, null, '2', '#');
允许 dashboard 用户订阅任何以 "$SYS/" 开头的主题
INSERT INTO `mqtt_acl` VALUES ('7', '1', null, 'dashboard', null, '1', '$SYS/#');
在实际应用环境中,设备客户端数量很多,如果每个设备都配置订阅和发布主题记录,则记录非常多;
比如有一百万个设备,则记录数就有两百万个,这样的配置非常不方便;
对订阅和发布相似主题的设备,配置模板记录,然后在查询语句中使用参数变量替换
insert `mqtt_acl`(`allow`,`username`,`access`,`topic`) values(1,'$all',1,'/$devTopic/get');
insert `mqtt_acl`(`allow`,`username`,`access`,`topic`) values(1,'$all',2,'/$devTopic/set');
auth.mysql.acl_query=select allow, ipaddr, username, clientid, access, REPLACE(topic,'$devTopic','%u') from mqtt_acl where ipaddr = '%a' or username = '%u' or username = '$all' or clientid = '%c'
auth.mysql.acl_query=select allow, ipaddr, username, clientid, access, REPLACE(topic,'$devTopic','%c') from mqtt_acl where ipaddr = '%a' or username = '%u' or username = '$all' or clientid = '%c'