第十五章 访问控制

article/2025/8/13 21:17:08

系列文章目录

第一章 总体概述
第二章 在实体机上安装ubuntu
第三章 Windows远程连接ubuntu
第四章 使用Docker安装和运行EMQX
第五章 Docker卸载EMQX
第六章 EMQX客户端MQTTX Desktop的安装与使用
第七章 EMQX客户端MQTTX CLI的安装与使用
第八章 Wireshark工具的安装与使用
第九章 MQTT报文
第十章 MQTT消息质量等级QoS
第十一章 MQTT主题
第十二章 MQTT会话
第十三章 MQTT消息
第十四章 MQTT订阅
第十五章 访问控制


文章目录

  • 系列文章目录
  • 前言
  • 1 认证
    • 1.1 创建认证器
      • 1.1.1 认证方式说明
      • 1.1.2 数据源说明
      • 1.1.3 配置参数说明
      • 1.1.4 认证测试
    • 1.2 认证列表
    • 1.3 用户管理
    • 1.4 客户端连接
  • 2 授权
    • 2.1 授权简介
    • 2.2 ACL文件授权演示
    • 2.3 基于内置数据库授权演示
  • 总结


前言

EMQX 提供了一个内置的管理控制台,即 EMQX Dashboard。方便用户通过 Web 页面就能轻松管理和监控 EMQX 集群,并配置和使用所需的各项功能。

访问地址:http://ip:18083

首次登录访问账号:admin/public

重置密码:

./bin/emqx ctl admins passwd <Username> <Password>

1 认证

1.1 创建认证器

认证:就是验证客户端的身份。

创建认证器大致步骤:

1、选择认证方式

2、配置数据源

3、配置数据源相关参数

打开方式如下:
在这里插入图片描述
打开以后如下:
在这里插入图片描述

1.1.1 认证方式说明

目前 EMQX 提供了5种认证方式,包含有:

  1. Password-Based,使用客户端 ID 或用户名加密码的认证方式;
  2. JWT,客户端可以在用户名或密码字段中携带 JWT token 来进行认证;
  3. SCRAM,MQTT 5.0 中的增强认证,可以实现对客户端和服务器的双向认证。
  4. GSSAPI,MQTT 5.0 中的增强认证,
  5. 使用 Client Information 进行认证

1.1.2 数据源说明

Password-Based

当选择 Password-Based 的认证方式后,用户可以选择存储认证数据的数据库或提供认证数据功能的 HTTP 服务器,数据库包含两类:

  • EMQX 的内置数据库,即选择 Built-in Database
  • 外部数据库,支持选择并连接到一些主流数据库,包括:MySQLPostgreSQLMongoDBRedis 等。

除数据库外,还可以直接使用能够提供认证数据的 HTTP 服务,即选择 HTTP Server
在这里插入图片描述

JWT

如果选择了 JWT 的认证方式,将无需选择数据源。

SCRAM

MQTT 5.0 中的增强认证功能,如果选择了该认证方式的话,目前仅提供了使用 Built-in Database 数据源。

1.1.3 配置参数说明

内置数据库

例如使用内置数据库的话需要选择使用用户名还是客户端 ID,选择密码的加密方式等;如果是选择了 MQTT 5.0 的增强认证,使用内置数据库的话,只需要配置加密方式即可。
在这里插入图片描述

外部数据库

选择外部数据库的话,需要配置能访问到的数据库地址,数据库名称,用户名密码,以及认证相关配置,填写如何从数据库中获取数据的 SQL 语句或其它查询语句等。以 MySQL 为例:
在这里插入图片描述
数据库环境准备:

# 创建数据库
docker run -d \
-p 3306:3306 \
-v mysql8_conf:/etc/mysql/conf.d \
-v mysql8_data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=1234 \
--name mysql8 \
--restart=always \
--privileged=true \
mysql:8.0.30# 导入资料中的mqtt_user.sql脚本

HTTP Server

选择使用 HTTP 服务的话,需要配置请求该 HTTP 服务的请求方式,POST 或 GET 方法。请求地址 URL,注意 URL 内需要填写协议是 http 或 https,如果有端口号的话需要在 URL 中携带端口号。然后是 HTTP 请求的 Headers 配置,携带认证信息的内容需要和请求 HTTP 服务的数据格式相同,然后配置到 Body 字段中,例如将 usernamepassword 填写到 JSON 数据中。
在这里插入图片描述

1.1.4 认证测试

1、认证方式
在这里插入图片描述
2、数据源
在这里插入图片描述
3、配置参数
在这里插入图片描述
4、创建结果
在这里插入图片描述
5、添加用户
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
6、MQTTX连接测试
在这里插入图片描述
在这里插入图片描述
结果:没有写用户名和密码,连接出错。
在这里插入图片描述
在这里插入图片描述
结果:输入正确的用户名和密码,连接成功。

1.2 认证列表

创建认证器成功后,可以在认证列表中查看和管理。认证列表的每一栏都可以通过鼠标来拖动调整顺序,或通过操作栏调整列表顺序,顺序对于认证列表来说有一定的重要性,因为EMQX允许创建多个认证器,这些认证器将按照在认证链中的位置顺序运行,如果在当前认证器中未检索到匹配的认证信息,将会切换至链上的下一个认证器继续认证过程。
在这里插入图片描述
认证链的认证流程,以密码认证为例,通常这会产生以下 2 种情况:

  1. 当前认证器执行时检索到了匹配的认证信息,例如用户名一致:

    1.1 密码完全匹配,则客户端认证通过,允许连接。

    1.2 密码无法匹配,则客户端认证失败,拒绝连接。

  2. 当前认证器执行时没有检索到匹配的认证信息,例如数据源中没有查找到数据:

    2.1 当前认证器之后还有认证器:忽略认证,交由下一认证器继续认证。

    2.2 当前认证器已经是链中最后一个认证器:客户端认证失败,拒绝连接。

1.3 用户管理

对于使用内置数据库的用户来说,在认证列表页点击 用户管理,可以来到用户管理页面,在该页面,可以管理认证信息,例如添加或删除用户名和密码,也可以通过下载模版,在模版内填充好相关的认证信息,点击 导入 来批量创建认证相关的用户信息。
在这里插入图片描述

1.4 客户端连接

当在MQTT的服务端创建完认证器以后,那么此时客户端在进行连接的时候就需要出示认证信息,如果未出示认证信息,那么此时就会报错Error: Connection

refused: Bad User Name or Password

在这里插入图片描述

2 授权

2.1 授权简介

通常情况下,认证只是验证了客户端的身份是否合法,而该客户端是否具备发布、订阅某些主题的权限,还需要由授权系统来判断。在 EMQX 中,授权是指对 MQTT 客户端的发布和订阅操作进行权限控制

授权检查器链:

1、EMQX支持多种授权检查机制:基于ACL文件(默认配置)、基于内置数据库、基于MySQL进行授权、基于 MongoDB 进行授权 、基于 PostgreSQL 进行授权 、基于Redis进行授权、基于HTTP应用进行授权 …

2、EMQX 支持用户通过配置多个授权检查器构成授权链,以实现更灵活的授权检查。EMQX 将按照授权链中配置的检查器顺序依次执行授权检查。如果在当前授权检查器中未检索到权限数据,将会切换至链上的下一个启用的授权检查器继续权限检查。

2.2 ACL文件授权演示

1、ACL授权说明

EMQX 支持基于 ACL 文件中存储的规则进行授权检查。您可在文件中配置多条授权检查规则,在收到客户端的操作请求后,EMQX 会按照从上到下的顺序进行授权规则匹配;在成功匹配到某条规则后,EMQX 将按设定允许或拒绝当前请求,并停止后续规则的匹配。
在这里插入图片描述

2、文件格式介绍

基本语法和概念如下:

  • 一组授权规则一个花括号包起来,花括号内的各个元素用逗号分隔
  • 每条规则应以 . 结尾
  • 注释行以 %% 开头,在解析过程中会被丢弃

代码示例:

%% 允许用户名是 dashboard 的客户端订阅 "$SYS/#" 这个主题
{allow, {user, "dashboard"}, subscribe, ["$SYS/#"]}.%% 允许来自127.0.0.1 的用户发布和订阅 "$SYS/#" 以及 "#"
{allow, {ipaddr, "127.0.0.1"}, all, ["$SYS/#", "#"]}.%% 拒绝其他所有用户订阅 `$SYS/#``#``+/#` 主题
{deny, all, subscribe, ["$SYS/#", {eq, "#"}, {eq, "+/#"}]}.%% 如果前面的规则都没有匹配到,则允许所有操作
%% 注意:在生产环境中,最后一条规则应该设置为 `{deny, all}`,并且配置 `authorization.no_match = deny`
{allow, all}.

在每一组授权规则中:

1、第一个元素表示该条规则对应的权限;可选值:

  • allow (允许)
  • deny(拒绝)

2、第二个元素用来指定适用此条规则的客户端,比如:

  • {username, "dashboard"}:用户名为 dashboard 的客户端;也可写作{user, "dashboard"}

  • {username, {re, "^dash"}}:用户名匹配 正则表达式 ^dash 的客户端

  • {clientid, "dashboard"}:客户端 ID 为 dashboard 的客户端,也可写作{client, "dashboard"}

  • {clientid, {re, "^dash"}}:客户端 ID 匹配 正则表达式 ^dash 的客户端

  • {ipaddr, "127.0.0.1"}:源地址为 127.0.0.1 的客户端;支持 CIDR 地址格式。注意:如果 EMQX 部署在负载均衡器后侧,建议为 EMQX 的监听器开启

    proxy_protocol 配置 ,否则 EMQX 可能会使用负载均衡器的源地址。

  • {ipaddrs, ["127.0.0.1", ..., ]}:来自多个源地址的客户端,不同 IP 地址之间以 , 区分

  • all:匹配所有客户端

  • {'and', [Spec1, Spec2, ...]} :满足列表中所有规范的客户端。

  • {'or', [Spec1, Spec2, ...]} :满足列表中任何规范的客户端。

3、第三个元素用来指定该条规则对应的操作:

  • publish:发布消息

  • subscribe:订阅主题

  • all:发布消息和订阅主题

  • 从 v5.1.1 版本开始,EMQX 支持检查发布与订阅操作中的 QoS 与保留消息标志位,您可以在第三个元素中加上 qos或者retain来指定检查的 QoS 或保留消息

    标志位,例如:

    • {publish, [{qos, 1}, {retain, false}]}:拒绝发布 QoS 为 1 的保留消息
    • {publish, {retain, true}}:拒绝发布保留消息
    • {subscribe, {qos, 2}}:拒绝以 QoS2 订阅主题

4、第四个元素用于指定当前规则适用的 MQTT 主题,支持通配符(主题过滤器),可以使用主题占位符

  • "t/${clientid}":使用了主题占位符,当客户端 ID 为 emqx_c 的客户端触发检查时,将精确匹配 t/emqx_c 主题
  • "$SYS/#":通过通配符匹配 $SYS/ 开头的所有主题,如 $SYS/foo$SYS/foo/bar
  • {eq, "foo/#"}:精确匹配 foo/# 主题,主题 foo/bar 将无法匹配,此处 eq 表示全等比较(equal)

另外还有 2 种特殊的规则,通常会用在 ACL 文件的末尾作为默认规则使用。

  • {allow, all}:允许所有请求
  • {deny, all}:拒绝所有请求

3、配置演示

在Dashboard的中权限配置文件中添加如下的配置:

# 拒绝任意的客户端订阅test/#这种规则的主题
{deny, all, subscribe, ["test/demo01"]}.

如下所示:
在这里插入图片描述

在这里插入图片描述

2.3 基于内置数据库授权演示

EMQX 通过内置数据库为用户提供了一种低成本、开箱即用的授权规则存储方式。可以通过 Dashboard 设置使用内置数据库作为数据源。

通过 Dashboard 配置:

1、在 EMQX Dashboard 页面,点击左侧导航栏的 访问控制 -> 授权,在 授权 页面,添加 Built-in Database 作为 数据源, 点击**下一步 **进入 **配置参数 **页签。由于无需配置其他参数,可直接点击 创建 完成配置。创建好如下:
在这里插入图片描述

2、通过 Dashboard 配置:在 Dashboard 的 授权 页面,点击 Built-in Database 数据源对应的 **操作 **栏下的 权限管理,即可进行授权检查规则的配置。

您可根据需要从客户端 ID、用户名或直接从主题角度设置授权检查。

  • 客户端 ID:见 客户端 ID 页签,指定适用此条规则的客户端
  • 用户名:见 用户名 页签,指定适用此条规则的用户名
  • 权限:是否允许当前客户端/用户的某类操作请求;可选值:允许拒绝
  • 操作:配置该条规则对应的操作;可选值:发布订阅发布与订阅
  • 主题:配置该条规则对应的主题

这里设置客户端ID:
注意设置为自己的客户端ID
在这里插入图片描述

设置好如下:
在这里插入图片描述

EMQX 支持针对单个客户端或用户配置多条授权检查规则,您可通过页面的 上移下移 调整不同规则的执行顺序和优先级。
在这里插入图片描述

注意:可以通过主题订阅来验证消息是否发送成功
在这里插入图片描述
因为在下面,所以仍然不可以订阅成功。

接下来,再为这个客户端增加一个授权信息。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
下面,移动到上面:
在这里插入图片描述

在这里插入图片描述
此时,发送失败。授权规则是从上到下进行匹配。


总结

以上就是今天要讲的内容,本文简单介绍了EMQX中访问控制和授权。


http://www.hkcw.cn/article/NBgVCUVlQZ.shtml

相关文章

LeetCode算法题 (搜索二维矩阵)Day18!!!C/C++

https://leetcode.cn/problems/search-a-2d-matrix/description/ 一、题目分析 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 ta…

基于谷歌ADK的智能客服系统简介

Google的智能体开发工具包&#xff08;Agent Development Kit&#xff0c;简称ADK&#xff09;是一个开源的、以代码为中心的Python工具包&#xff0c;旨在帮助开发者更轻松、更灵活地构建、评估和部署复杂的人工智能智能体&#xff08;AI Agent&#xff09;。ADK 是一个灵活的…

MySql(十三)

目录 mysql外键约束 准备工作 创建表 插入数据 创建表时添加外键 1..格式 2..创建表student表时&#xff0c;为其添加外键 3.插入数据测试 正常数据 异常数据 3.使用alter添加外键 删除外键 添加外键 4.Mysql外键不生效的原因 修改引擎 phpystudy的mysql位置 mysql外键约束 注&…

WEBSTORM前端 —— 第3章:移动 Web —— 第2节:空间转换、转化

目录 一、空间转换 1.空间转换 2.空间转换 – 平移 3.视距 perspective 4.空间 – 旋转 ③空间旋转——Z轴代码与效果视频 ④空间旋转——X轴代码与效果视频 ⑤空间旋转——Y轴代码与效果视频 5.立体呈现 – transform-style 案例 – 3D 导航 6.空间转换 – 缩放 …

【AI论文】R2R:通过小型与大型模型之间的令牌路由高效导航发散推理路径

摘要&#xff1a;大型语言模型&#xff08;LLMs&#xff09;以巨大的推理开销为代价&#xff0c;实现了令人印象深刻的推理能力&#xff0c;这带来了巨大的部署挑战。 尽管蒸馏的小语言模型&#xff08;SLM&#xff09;显著提高了效率&#xff0c;但由于它们无法遵循LLM的推理路…

学习日记-day20-6.1

完成目标&#xff1a; 知识点&#xff1a; 1.集合_Collections集合工具类 方法:static <T> boolean addAll(Collection<? super T> c, T... elements)->批量添加元素 static void shuffle(List<?> list) ->将集合中的元素顺序打乱static <T>…

区块链可投会议CCF B--EDBT 2026 截止10.8 附录用率

Conference&#xff1a;EDBT: 29th International Conference on Extending Database Technology CCF level&#xff1a;CCF B Categories&#xff1a;数据库&#xff0f;数据挖掘&#xff0f;内容检索 Year&#xff1a;2026 Conference time&#xff1a;24th March - 27th…

蓝光过滤APP:护眼小助手,守护您的视力健康

在数字时代&#xff0c;手机和平板电脑已成为我们生活中不可或缺的工具。无论是工作、学习还是娱乐&#xff0c;长时间使用这些设备已成为常态。然而&#xff0c;长时间盯着屏幕不仅会导致眼睛疲劳&#xff0c;还可能对视力造成不可逆的损害。蓝光过滤APP正是为了解决这一问题而…

AAA基础配置

文章目录 组网需求组网拓扑实验步骤测试结果配置文件 组网需求 为组网安全&#xff0c;经常会使用AAA技术&#xff0c;本次以CE12800交换机Window为例&#xff0c;实现AAA本地认证登录 组网拓扑 实验步骤 配置接口IP&#xff0c;连通终端进入AAA视图配置用户名密码配置账户权…

基于Dify实现各类报告文章的智能化辅助阅读

大家在日常工作中经常需要阅读或审核各类报告、纪要、文章等材料,但经常由于时间有限,无法完整的阅读全文,因此就需要类似于秘书或者助手角色来帮助整理出报告的主要内容,观点和支撑信息等,这些需求恰恰是目前AI大模型的强项,因此本次就基于dify的工作流实现单个报告材料…

实验:基于SpringBoot+MyBatis-Plus实现文章列表增删改查

目录 实验内容前言一、添加新的依赖二、配置连接MySQL数据库三、创建实体类以及Mapper、Service和Controller三层架构POJOMapperServiceIServiceServiceImpl Controller 四、添加配置类、响应类和全局异常处理类五、根据接口文档编写控制器方法并测试接口1.新增文章接口1.1 基本…

CS144 - Lecture 2

CS144 - Lecture 1 TCP 这里就简单讲了一下它的基本性质&#xff0c;没啥好说的 UDP 提供不可靠的传输服务&#xff0c;我们的 DNS 服务和 DHCP 都是用的 UDP 协议。 对于 DNS 我们只是单纯地向 DNS 服务器发送域名&#xff0c;然后返回一个 IP&#xff0c;如果还需要建立…

Go中MAP底层原理分析

MAP底层原理分析 参考 https://golang.design/go-questions/map/principalmap | Golang 中文学习文档 先来看一下map结构体&#xff0c;&#xff08;runtime.hmap结构体就是代表着 go 中的map&#xff0c;与切片一样map的内部实现也是结构体&#xff09; type hmap struct {/…

第十六章 EMQX黑名单与连接抖动检测

系列文章目录 第一章 总体概述 第二章 在实体机上安装ubuntu 第三章 Windows远程连接ubuntu 第四章 使用Docker安装和运行EMQX 第五章 Docker卸载EMQX 第六章 EMQX客户端MQTTX Desktop的安装与使用 第七章 EMQX客户端MQTTX CLI的安装与使用 第八章 Wireshark工具的安装与使用 …

构建系统maven

1 前言 说真的&#xff0c;我是真的不想看构建了&#xff0c;因为真的太多了。又多又乱。Maven、Gradle、Make、CMake、Meson、Ninja&#xff0c;Android BP。。。感觉学不完&#xff0c;根本学不完。。。 但是没办法最近又要用一下Maven&#xff0c;所以咬着牙再简单整理一下…

java CountDownLatch‌

CountDownLatch是用于线程同步的工具类&#xff0c;主要作用是让当前线程等待其他线程完成操作后再继续执行。 示例代码&#xff1a; import java.util.concurrent.CountDownLatch;private static void testCountDownLatch() {int taskNum 5;CountDownLatch latch new Count…

[yolov11改进系列]基于yolov11引入上下文锚点注意力CAA的python源码+训练源码

【CAA介绍】 本文记录的是基于CAA注意力模块的RT-DETR目标检测改进方法研究。在远程遥感图像或其他大尺度变化的图像中目标检测任务中&#xff0c;为准确提取其长距离上下文信息&#xff0c;需要解决大目标尺度变化和多样上下文信息时的不足的问题。CAA能够有效捕捉长距离依赖…

【Java基础】Java入门教程

文章目录 一、Java开发环境概述☕ Java开发全景架构&#x1f4e6; JDK (Java Development Kit)&#x1f5a5;️ IDE (集成开发环境)&#x1f504; 工作流关系 二、JDK下载与安装2.1 下载JDK2.2 安装JDK 三、环境变量配置3.1 Windows配置3.2 macOS/Linux配置为当前用户配置环境变…

通过openpyxl在excel中插入散点图

实现代码 # -*- coding: utf-8 -*- """ Created on Sat May 31 23:30:12 2025author: anyone """from openpyxl import load_workbook from openpyxl.chart import ScatterChart, Reference, Series from openpyxl.chart.series import SeriesL…

零基础安装 Python 教程:从下载到环境配置一步到位(支持 VSCode 和 PyCharm)与常用操作系统操作指南

零基础安装 Python 教程&#xff1a;从下载到环境配置一步到位&#xff08;支持 VSCode 和 PyCharm&#xff09;与常用操作系统操作指南 本文是一篇超详细“Python安装教程”&#xff0c;覆盖Windows、macOS、Linux三大操作系统的Python安装方法与环境配置&#xff0c;包括Pyt…