emq acl校验

2023-10-23 23:32
文章标签 校验 acl emq

本文主要是介绍emq acl校验,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

访问控制(ACL)

EMQ 消息服务器通过 ACL(Access Control List) 实现 MQTT 客户端访问控制。

ACL 访问控制规则定义:

允许(Allow)|拒绝(Deny) (Who) 订阅(Subscribe)|发布(Publish) 主题列表(Topics) 

MQTT 客户端发起订阅/发布请求时,EMQ 消息服务器的访问控制模块,会逐条匹配 ACL 规则,直到匹配成功为止:

          ---------              ---------              ---------
Client -> | Rule1 | --nomatch--> | Rule2 | --nomatch--> | Rule3 | --> Default --------- --------- --------- | | | match match match \|/ \|/ \|/ allow | deny allow | deny allow | deny 

默认访问控制设置

EMQ 消息服务器默认访问控制,在 etc/emq.conf 中设置:

## ACL nomatch
mqtt.acl_nomatch = allow

## Default ACL File
mqtt.acl_file = etc/acl.conf

ACL 规则定义在 etc/acl.conf,EMQ 启动时加载到内存:

%% Allow 'dashboard' to subscribe '$SYS/#'
{allow, {user, "dashboard"}, subscribe, ["$SYS/#"]}. 

%% Allow clients from localhost to subscribe any topics
{allow, {ipaddr, “127.0.0.1”}, pubsub, ["$SYS/#", “#”]}.

%% Deny clients to subscribe 'KaTeX parse error: Expected 'EOF', got '#' at position 4: SYS#̲' and '#' <span…SYS/#", {eq, “#”}]}.

%% Allow all by default
{allow, all}.

HTTP 插件访问控制

注解

开启 HTTP 插件后,会终结 ACL 链

HTTP API 实现访问控制: https://github.com/emqtt/emq_auth_http

配置 etc/plugins/emq_auth_http.conf, 启用 HTTP 认证插件后:

## 'access' parameter: sub = 1, pub = 2
auth.http.acl_req = http://127.0.0.1:8080/mqtt/acl
auth.http.acl_req.method = get auth.http.acl_req.params = access=%A,username=%u,clientid=%c,ipaddr=%a,topic=%t 

MySQL 插件访问控制

MySQL 插件访问控制,通过 mqtt_acl 表定义 ACL 规则:

CREATE TABLE `mqtt_acl` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `allow` int(1) DEFAULT NULL 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=utf8; 

INSERT INTO mqtt_acl (id, allow, ipaddr, username, clientid, access, topic)
VALUES
(1,1,NULL,KaTeX parse error: Expected 'EOF', got '#' at position 112: …an class="s1">'#̲'<span class="p…all’,NULL,1,KaTeX parse error: Expected 'EOF', got '#' at position 5: SYS/#̲'<span class="p…all’,NULL,1,‘eq #’),
(5,1,‘127.0.0.1’,NULL,NULL,2,KaTeX parse error: Expected 'EOF', got '#' at position 5: SYS/#̲'<span class="p…SYS/#’);

etc/plugins/emq_auth_mysql.conf 配置 ‘acl_query’ 与 ‘acl_nomatch’:

## ACL Query Command
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'

Postgre 插件访问控制

PostgreSQL 插件访问控制,通过 mqtt_acl 表定义 ACL 规则:

CREATE TABLE mqtt_acl (id SERIAL primary key, allow integer, ipaddr character varying(60), username character varying(100), clientid character varying(100), access integer, topic character varying(100) ); 

INSERT INTO mqtt_acl (id, allow, ipaddr, username, clientid, access, topic)
VALUES
(1,1,NULL,KaTeX parse error: Expected 'EOF', got '#' at position 112: …an class="s1">'#̲'<span class="p…all’,NULL,1,KaTeX parse error: Expected 'EOF', got '#' at position 5: SYS/#̲'<span class="p…all’,NULL,1,‘eq #’),
(5,1,‘127.0.0.1’,NULL,NULL,2,KaTeX parse error: Expected 'EOF', got '#' at position 5: SYS/#̲'<span class="p…SYS/#’);

etc/plugins/emq_auth_pgsql.conf 设置 ‘acl_query’ 与 ‘acl_nomatch’:

## ACL Query. Comment this query, the acl will be disabled.
auth.pgsql.acl_query = select allow, ipaddr, username, clientid, access, topic from mqtt_acl where ipaddr = '%a' or username = '%u' or username = '$all' or clientid = '%c'

Redis 插件访问控制

Redis Hash 存储一个 MQTT 客户端的访问控制规则:

HSET mqtt_acl:<username> topic1 1 HSET mqtt_acl:<username> topic2 2 HSET mqtt_acl:<username> topic3 3 

etc/plugins/emq_auth_redis.conf 配置 ‘acl_cmd’ 与 ‘acl_nomatch’:

## ACL Query Command
auth.redis.acl_cmd = HGETALL mqtt_acl:%u

MongoDB 插件访问控制

MongoDB 数据库创建 mqtt_acl 集合:

{username: "username",clientid: "clientid", publish: ["topic1", "topic2", ...], subscribe: ["subtop1", "subtop2", ...], pubsub: ["topic/#", "topic1", ...] } 

mqtt_acl 集合插入数据,例如:

db.mqtt_acl.insert({username: "test", publish: ["t/1", "t/2"], subscribe: ["user/%u", "client/%c"]}) db.mqtt_acl.insert({username: "admin", pubsub: ["#"]}) 

etc/plugins/emq_auth_mongo.conf 配置 ‘acl_query’ 与 ‘acl_nomatch’:

## acl_query
auth.mongo.acl_query.collection = mqtt_user

auth.mongo.acl_query.selector = username=%u

这篇关于emq acl校验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/271187

相关文章

Android 二维码、条形码(识别率校验)

ZxingCode 以core-3.4.jar为基础构建,具有如下功能: 1.创建条形码、二维码; 2.相机扫描条形码、二维码; 3.读取照片条形码、二维码; 4.识别率算法修改提升; 5.扫码View背景颜色可修改; FIX-2022.5.12.1 1.新增手电筒开关调用方法; 2.新增暂停解码方法; 3.新增恢复解码方法; 4.虚拟机扫码崩溃; 5.OnScanCodeListener统

金蝶盘点机金蝶PDA外购入库单校验防止收错货实现商品品种和数量校验

采购入库单校验 单据校验,是在电脑上已经存在这个单据,然后对商品实物跟单据进行核对,校验品种和数量。 传统的【采购入库单】校验方式是,供应商送货来,仓管员拿着纸质的【采购入库单】清点商品数量, 并一行行的记录商品数量,这个过程如果商品品种几十种,几百种,就很容核对错误,而且费时费力,搞得头晕眼花,工作强度比较大,对仓管员的责任心和细心程度要求比较高。 如果使用盘点机PDA进行【采购入库

注解+反射 参数校验更加简洁

背景 做RPC接口的时候 我们需要对一些字段做非空校验 在字段很多的情况下 如果一个一个的用if判断 代码会很恶心 所以我们需要有一种便捷的方式去实现这个功能 比如使用注解+反射的方式 怎么做? 首先定义注解 非空注解: package com.api.annotation;import java.lang.annotation.*;/*** 非空校验注解*/@Target({Elemen

Java中的标准注解与数据校验:深入解析与实例

目录 Java中的标准注解与数据校验:深入解析与实例1. 基础校验注解`@NonNull``@NotBlank``@Size` 2. 数值校验注解`@Min` & `@Max``@Positive` & `@Negative` 3. 枚举与模式匹配自定义注解示例(概念性展示) 4. 自定义校验逻辑结论 Java中的标准注解与数据校验:深入解析与实例 在Java开发中,注解(An

APK签名校验绕过

将APK重命名为zip文件,然后可以看到有个META-INF的文件夹,里面有三个文件,分别名为MANIFEST.MF、CERT.SF和CERT.RSA,这些就是使用signapk.jar生成的签名文件。 1、 MANIFEST.MF文件: 程序遍历update.apk包中的所有文件(entry),对非文件夹非签名文件的文件,逐个生成SHA1的数字签名信息,再用Base64进行编码。具体代

java 日期校验yyyymmdd

package com.wl.cigrec.util;public class DateUtil {/*** 判断参数的格式是否为“yyyyMMdd”格式的合法日期字符串* * @author Liang.Wang* @since 02/24/15* @param str* @return true/false*/public static boolean isValidDate(String s

Android正则校验手机号码

不多说了直接上校验方法 /** * 验证手机号码 * 正确返回true,错误返回false * @param mobiles * @return [0-9]{5,9} */ public static boolean isMobileNO(String mobiles) { Pattern p = Pattern .compile("^((13[0-9]

使用 C# 进行 JSON 反序列化实体必填项校验(webform)

在使用 JSON 进行数据传输时,反序列化为实体对象是常见的操作。为了确保反序列化后的对象满足业务逻辑的要求,需要对实体对象的必填字段进行校验。本文将介绍如何在非 .NET Core MVC 项目中,使用 C# 和数据注解来进行 JSON 反序列化实体的必填项校验,并实现自定义校验方法。 实体类定义 首先,定义三个实体类:RootObject、Condition 和 RuleCombina

el-upload组件校验不通过预览列表依然显示图片问题解决

如图校验不通过的图片依然显示在预览列表了,需要在校验不通过的时候移除图片 <el-uploadclass="upload-cls":action="ossSignature.host":auto-upload="false"ref="upload":list-type="listType":limit="limit":on-change="handleChange":on-re

Vue中使用ElementUI组件Form组件的校验validate

先准备一些el-form元素 这里面el-form中:model(v-bind:model)是单项绑定的,如果你写成了v-model=""可能会出现校验没有效果的情况。 这是校验过后的结果了 现在开始使用下吧! 1.在el-form中绑定一个ref,名字自拟,后续触发检验结果需要使用到它 2.准备rules对象,里面装校验的内容 3.需要校验的元素上需要加上prop,这个是对应校