emqx_auth_mysql批量定义ACL鉴权
-
参考 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、mqtt_acl表的字段说明
- allow字段
1: allow; 0: deny
- ipaddr字段
客户端的IP地址
- username字段
客户端的用户名,如果表示所有用户可以使用$all表示
- clientid字段
客户端的clientId
- access字段
1: subscribe(订阅); 2: publish(发布); 3: publish and subscribe(发布和订阅);
- topic字段
主题字段
“#”:除以 '$' 字符开头以外的任何主题;
"$SYS/#":以 "$SYS/" 开头的主题
“eq #”: "#" 主题
2、mqtt_acl表查询语句的变量说明
- %a: ipaddr
- %u: username
- %c: clientid
3、例子说明
允许任何用户发布除以 '$' 字符开头以外的任何主题的消息
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/#');
4、批量定义ACL鉴权
- 问题
在实际应用环境中,设备客户端数量很多,如果每个设备都配置订阅和发布主题记录,则记录非常多;
比如有一百万个设备,则记录数就有两百万个,这样的配置非常不方便;
- 解决方式
对订阅和发布相似主题的设备,配置模板记录,然后在查询语句中使用参数变量替换
4.1 入库记录
- 允许用户订阅和发布订阅的主题
- 如:用户A允许订阅/A/get主题,允许发布/A/set主题
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');
4.2 auth.mysql.acl_query查询语句
- 使用用户名作为topic动态名称
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'
- 使用clientId作为topic动态名称
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'
本文介绍了如何使用emqx_auth_mysql模块进行批量定义ACL鉴权,重点讲解了mqtt_acl表的字段含义,如allow、ipaddr、access等,并提供了变量说明,如%a、%u、%c。通过示例展示了如何为用户配置订阅和发布权限,以及如何通过auth.mysql.acl_query查询语句实现动态topic名称的设定。
245

被折叠的 条评论
为什么被折叠?



