当前位置: 首页 > java >正文

第十五章 访问控制

系列文章目录

第一章 总体概述
第二章 在实体机上安装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.xdnf.cn/news/10395.html

相关文章:

  • DelphiXe12创建DataSnap REST Application
  • 深度学习篇---face-recognition的优劣点
  • 计算机视觉---YOLOv5
  • 多模态大语言模型arxiv论文略读(102)
  • HackMyVM-Jabita
  • AI精准挖掘SEO关键词策略
  • Spring Security安全实践指南
  • 《操作系统真相还原》——进入内核
  • NodeJS全栈开发面试题讲解——P11消息队列(MQ)
  • 杨校老师竞赛课之GESP一级C++[2024-12]真题及题解
  • git 学习
  • Leetcode 3567. Minimum Absolute Difference in Sliding Submatrix
  • Spring Boot 全局配置文件优先级
  • 基于springboot的宠物领养系统
  • 本振相参解析(1)2025.6.1
  • 【华为云Astro】从OBS CSV文件获取配置指南
  • 语音数据处理:ueng 与 ong 的统一表示方案
  • Python数据类型详解:从字符串到布尔值,一网打尽
  • Vue-2-前端框架Vue基础入门之二
  • 从单机到集群,再到分布式,再到微服务
  • 【计算机系统结构】习题2
  • 雪花算法:分布式ID生成的优雅解决方案
  • 【2025.06】jupyter notebook 7+ 新手安装、配置、扩展应用(windows篇)
  • 【配置指南】Dify部署超全配置参考手册
  • 类和对象(4)
  • 税法 -2.2- 增值税-允许抵扣的进项税额
  • 零基础安装 Python 教程:从下载到环境配置一步到位(支持 VSCode 和 PyCharm)与常用操作系统操作指南
  • X-MACRO使用技巧
  • linux命令 systemctl 和 supervisord 区别及用法解读
  • 【计算机网络】Linux下简单的UDP服务器(超详细)