热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

emq+mysql设置_EMQMySQL认证和MySQL访问控制权限

MySQL认证MySQL认证使用外部MySQL数据库作为认证数据源,可以存储大量数据,同时方便与外部设备管理系统集成。插件:emqx_au

MySQL 认证

MySQL 认证使用外部 MySQL 数据库作为认证数据源,可以存储大量数据,同时方便与外部设备管理系统集成。

插件:emqx_auth_mysql

MySQL ACL

MySQL ACL 使用外部 MySQL 数据库存储 ACL 规则,可以存储大量数据、动态管理 ACL,方便与外部设备管理系统集成

插件:emqx_auth_mysql

默认表结构

MySQL 认证插件默认配置下需要确保数据库中有以下两张数据表,用于存储认证规则信息:

认证/超级用户表

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` (1) DEFAULT 0,

`created` datetime DEFAULT NULL,

PRIMARY KEY (`id`),

UNIQUE KEY `mqtt_username` (`username`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

示例数据:

-- 客户端信息

INSERT INTO `mqtt_user` ( `username`, `password`, `salt`, `is_superuser`)

VALUES

(‘emqx‘, ‘efa1f375d76194fa51a3556a97e641e61685f914d446979da50a551a4333ffd7‘, NULL, 0);

启用 MySQL 认证后,可以通过用户名: emqx 密码:public 连接

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;

规则表字段说明:

allow:禁止(0),允许(1)

ipaddr:设置 IP 地址

username:连接客户端的用户名,此处的值如果设置为 $all 表示该规则适用于所有的用户

clientid:连接客户端的 Client ID

access:允许的操作:订阅(1),发布(2),订阅发布都可以(3)

topic:控制的主题,可以使用通配符,并且可以在主题中加入占位符来匹配客户端信息,例如 t/%c 则在匹配时主题将会替换为当前客户端的 Client ID

%u:用户名

%c:Client ID

示例数据:

-- 所有用户不可以订阅系统主题

INSERT INTO mqtt_acl (allow, ipaddr, username, clientid, access, topic) VALUES (0, NULL, ‘$all‘, NULL, 1, ‘$SYS/#‘);

-- 允许 10.59.1.100 上的客户端订阅系统主题

INSERT INTO mqtt_acl (allow, ipaddr, username, clientid, access, topic) VALUES (1, ‘10.59.1.100‘, NULL, NULL, 1, ‘$SYS/#‘);

-- 禁止客户端订阅 /smarthome/+/temperature 主题

INSERT INTO mqtt_acl (allow, ipaddr, username, clientid, access, topic) VALUES (0, NULL, NULL, NULL, 1, ‘/smarthome/+/temperature‘);

-- 允许客户端订阅包含自身 Client ID 的 /smarthome/${clientid}/temperature 主题

INSERT INTO mqtt_acl (allow, ipaddr, username, clientid, access, topic) VALUES (1, NULL, NULL, NULL, 1, ‘/smarthome/%c/temperature‘);

启用 MySQL ACL 后并以用户名 emqx 成功连接后,客户端应当数据具有相应的主题权限。

启用 MySQL 认证和访问控制权限, 配置etc/plugins/emqx_auth_mysql.conf

## 服务器地址

auth.mysql.server = 127.0.0.1:3306## 连接池大小

auth.mysql.pool = 8

## mysql用户名auth.mysql.username = emqx## mysql密码auth.mysql.password = public##mqtt_user认证/超级用户表和mqtt_acl ACL规则表所在的数据库auth.mysql.database = mqttauth.mysql.query_timeout= 5s

## mysql加盐规则与哈希算法auth.mysql.password_hash = sha256## 认证SQL(auth_query)auth.mysql.auth_query=select password from mqtt_user where username=‘%u‘ limit1进行身份认证时,EMQ X 将使用当前客户端信息填充并执行用户配置的认证 SQL,查询出该客户端在数据库中的认证数据。

可以在 SQL 中使用以下占位符,执行时 EMQ X 将自动填充为客户端信息:

%u:用户名

%c:Client ID

%C:TLS 证书公用名(证书的域名或子域名),仅当 TLS 连接时有效

%d:TLS 证书 subject,仅当 TLS 连接时有效

可以根据业务需要调整认证 SQL,如添加多个查询条件、使用数据库预处理函数,以实现更多业务相关的功能。但是任何情况下认证 SQL 需要满足以下条件:

查询结果中必须包含 password 字段,EMQ X 使用该字段与客户端密码比对

如果启用了加盐配置,查询结果中必须包含 salt 字段,EMQ X 使用该字段作为 salt(盐)值

查询结果只能有一条,多条结果时只取第一条作为有效数据

## 超级用户SQL(super_query)auth.mysql.super_query = select is_superuser from mqtt_user where username = ‘%u‘ limit 1进行 ACL 鉴权时,EMQ X 将使用当前客户端信息填充并执行用户配置的超级用户 SQL,查询客户端是否为超级用户。客户端为超级用户时将跳过 ACL SQL。

可以在 SQL 中使用以下占位符,执行时 EMQ X 将自动填充为客户端信息:

%u:用户名

%c:Client ID

%C:TLS 证书公用名(证书的域名或子域名),仅当 TLS 连接时有效

%d:TLS 证书 subject,仅当 TLS 连接时有效

可以根据业务需要调整超级用户 SQL,如添加多个查询条件、使用数据库预处理函数,以实现更多业务相关的功能。但是任何情况下超级用户 SQL 需要满足以下条件:

查询结果中必须包含 is_superuser 字段,is_superuser 应该显式的为 true

查询结果只能有一条,多条结果时只取第一条作为有效数据

## ACL SQL(acl_query)auth.mysql.acl_query=select allow, ipaddr, username, clientid, access, topic from mqtt_acl where ipaddr=‘%a‘ or username=‘%u‘ or username=‘$all‘ or clientid=‘%c‘进行 ACL 鉴权时,EMQ X 将使用当前客户端信息填充并执行用户配置的超级用户 SQL,如果没有启用超级用户 SQL 或客户端不是超级用户,则使用 ACL SQL 查询出该客户端在数据库中的 ACL 规则。

可以在 ACL SQL 中使用以下占位符,执行时 EMQ X 将自动填充为客户端信息:

%u:用户名

%c:Client ID

%C:TLS 证书公用名(证书的域名或子域名),仅当 TLS 连接时有效

%d:TLS 证书 subject,仅当 TLS 连接时有效

可以根据业务需要调整 ACL SQL,如添加多个查询条件、使用数据库预处理函数,以实现更多业务相关的功能。但是任何情况下 ACL SQL 需要满足以下条件:

查询结果中必须包含 allow、access、topic、clientid、username、ipaddr 字段,如果字段不想参与比对则使用 $all 字符串或者数据库 NULL 值

查询结果可以有多条,多条结果时按照从上到下的顺序进行匹配

原文:https://www.cnblogs.com/xiaoxianxianxian/p/13191261.html



推荐阅读
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • Explain如何助力SQL语句的优化及其分析方法
    本文介绍了Explain如何助力SQL语句的优化以及分析方法。Explain是一个数据库SQL语句的模拟器,通过对SQL语句的模拟返回一个性能分析表,从而帮助工程师了解程序运行缓慢的原因。文章还介绍了Explain运行方法以及如何分析Explain表格中各个字段的含义。MySQL 5.5开始支持Explain功能,但仅限于select语句,而MySQL 5.7逐渐支持对update、delete和insert语句的模拟和分析。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
author-avatar
手机用户2502884005
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有