热门标签 | 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



推荐阅读
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 包含phppdoerrorcode的词条 ... [详细]
  • Linux下MySQL 8.0.28安装指南
    本文详细介绍了在Linux系统上安装MySQL 8.0.28的步骤,包括下载数据库、解压数据包、安装必要组件和启动MySQL服务。 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • Unity与MySQL连接过程中出现的新挑战及解决方案探析 ... [详细]
  • 如何在PHP中准确获取服务器IP地址?
    如何在PHP中准确获取服务器IP地址? ... [详细]
  • 本文详细介绍了一种利用 ESP8266 01S 模块构建 Web 服务器的成功实践方案。通过具体的代码示例和详细的步骤说明,帮助读者快速掌握该模块的使用方法。在疫情期间,作者重新审视并研究了这一未被充分利用的模块,最终成功实现了 Web 服务器的功能。本文不仅提供了完整的代码实现,还涵盖了调试过程中遇到的常见问题及其解决方法,为初学者提供了宝贵的参考。 ... [详细]
  • 在开发过程中,我最初也依赖于功能全面但操作繁琐的集成开发环境(IDE),如Borland Delphi 和 Microsoft Visual Studio。然而,随着对高效开发的追求,我逐渐转向了更加轻量级和灵活的工具组合。通过 CLIfe,我构建了一个高度定制化的开发环境,不仅提高了代码编写效率,还简化了项目管理流程。这一配置结合了多种强大的命令行工具和插件,使我在日常开发中能够更加得心应手。 ... [详细]
  • Linux入门教程第七课:基础命令与操作详解
    在本课程中,我们将深入探讨 Linux 系统中的基础命令与操作,重点讲解网络配置的相关知识。首先,我们会介绍 IP 地址的概念及其在网络协议中的作用,特别是 IPv4(Internet Protocol Version 4)的具体应用和配置方法。通过实际操作和示例,帮助初学者更好地理解和掌握这些基本技能。 ... [详细]
  • Spring Data JdbcTemplate 入门指南
    本文将介绍如何使用 Spring JdbcTemplate 进行数据库操作,包括查询和插入数据。我们将通过一个学生表的示例来演示具体步骤。 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • HBase Java API 进阶:过滤器详解与应用实例
    本文详细探讨了HBase 1.2.6版本中Java API的高级应用,重点介绍了过滤器的使用方法和实际案例。首先,文章对几种常见的HBase过滤器进行了概述,包括列前缀过滤器(ColumnPrefixFilter)和时间戳过滤器(TimestampsFilter)。此外,还详细讲解了分页过滤器(PageFilter)的实现原理及其在大数据查询中的应用场景。通过具体的代码示例,读者可以更好地理解和掌握这些过滤器的使用技巧,从而提高数据处理的效率和灵活性。 ... [详细]
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社区 版权所有