3、emqx_auth_mysql批量定义ACL鉴权

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)