emq连接认证,订阅发布权限控制

emq连接认证,订阅发布权限控制

连接认证

我这里使用的是HTTP认证方式,简单无代码侵入

EMQ X 默认配置中启用了匿名认证,任何客户端都能接入 EMQ X。没有启用认证插件或认证插件没有显式允许/拒绝(ignore)连接请求时,EMQ X 将根据匿名认证启用情况决定是否允许客户端连接。

关闭匿名认证

shell 复制代码
修改匿名认证开关false:
# etc/emqx.conf

## Value: true | false
allow_anonymous = false
 

认证请求

官方文档地址: https://docs.emqx.cn/broker/v4.3/advanced/auth-http.html#认证原理

进行身份认证时,EMQ X 将使用当前客户端信息填充并发起用户配置的认证查询请求,查询出该客户端在 HTTP 服务器端的认证数据。

配置http连接认证接口

shell 复制代码
# etc/plugins/emqx_auth_http.conf

## 请求地址
auth.http.auth_req.url = http://127.0.0.1:8080/auth/isAuth.json

## HTTP 请求方法
## Value: post | get | put
auth.http.auth_req.method = post

## 认证请求的 HTTP 请求头部,默认情况下配置 Content-Type 头部。
## Content-Type 头部目前支持以下值:application/x-www-form-urlencoded,application/json
auth.http.auth_req.headers.content_type = application/json


## 请求参数
auth.http.auth_req.params = clientid=%c,username=%u,password=%P

EMQ X 在设备连接事件中使用当前客户端相关信息作为参数,向用户自定义的认证服务发起请求查询权限,通过返回的 HTTP 响应状态码 (HTTP statusCode) 来处理认证请求。

  • 认证失败:API 返回 4xx 状态码
  • 认证成功:API 返回 200 状态码
  • 忽略认证:API 返回 200 状态码且消息体 ignore

订阅发布HTTP ACL授权

配置http连接认证接口

super user请求接口

超级用户(superuser)

客户端可拥有"超级用户"身份,超级用户拥有最高权限不受 ACL 限制。

  • 认证鉴权插件启用超级用户功能后,发布订阅时 EMQ X 将优先检查客户端超级用户身份
  • 客户端为超级用户时,通过授权并跳过后续 ACL 检查

首先查询客户端是否为超级用户,客户端为超级用户时将跳过 ACL 查询。

shell 复制代码
# etc/plugins/emqx_auth_http.conf

## 请求地址
auth.http.super_req.url = http://127.0.0.1:8080/auth/isSuper.json

## HTTP 请求方法
## Value: post | get | put
auth.http.super_req.method = post

auth.http.super_req.headers.content-type = application/json

## 请求参数
auth.http.super_req.params = clientid=%c,username=%u
ACL授权查询请求

官方文档地址: https://docs.emqx.cn/broker/v4.3/advanced/acl-http.html#acl-授权原理

不是超级用户时,查询有没有订阅发布的权限

shell 复制代码
# etc/plugins/emqx_auth_http.conf

## 请求地址
auth.http.acl_req.url = http://127.0.0.1:8080/auth/isPermission.json

## HTTP 请求方法
## Value: post | get | put
auth.http.acl_req.method = post

auth.http.acl_req.headers.content-type = application/json

## 请求参数
auth.http.acl_req.params = access=%A,username=%u,clientid=%c,topic=%t

EMQ X 在设备发布、订阅事件中使用当前客户端相关信息作为参数,向用户自定义的认证服务发起请求权限,通过返回的 HTTP 响应状态码 (HTTP statusCode) 来处理 ACL 授权请求。

  • 无权限:API 返回 4xx 状态码
  • 授权成功:API 返回 200 状态码
  • 忽略授权:API 返回 200 状态码且消息体 ignore

ACL 缓存

ACL 缓存允许客户端在命中某条 ACL 规则后,便将其缓存至内存中,以便下次直接使用,客户端发布、订阅频率较高的情况下开启 ACL 缓存可以提高 ACL 检查性能。

在 etc/emqx.conf 可以配置 ACL 缓存大小与缓存时间:

shell 复制代码
# etc/emqx.conf

## 是否启用
enable_acl_cache = on

## 单个客户端最大缓存规则数量
acl_cache_max_size = 32

## 缓存失效时间,超时后缓存将被清除
acl_cache_ttl = 1m

清除ACL缓存

当权限发生改变,或删除权限时,此时有缓存,还是可以正常订阅发布数据,需要清除缓存

在更新 ACL 规则后,某些客户端由于已经存在缓存,则无法立即生效。若要立即生效,则需手动清除所有的 ACL 缓存:

调用HTTP API接口

官方文档地址: https://docs.emqx.cn/broker/v4.3/advanced/http-api.html#客户端

shell 复制代码
首先根据用户名查询到连接信息 
$ curl -i --basic -u admin:public -X GET "http://localhost:8081/api/v4/clients/username/steve"

查询到的连接信息里找到clientid,清除 ACL 缓存
$ curl -i --basic -u admin:public -X DELETE "http://localhost:8081/api/v4/clients/123456/acl_cache" 

查询指定客户端的 ACL 缓存
$ curl -i --basic -u admin:public -X GET "http://localhost:8081/api/v4/clients/123456/acl_cache"

踢除指定客户端。注意踢除客户端操作会将连接与会话一并终结。
$ curl -i --basic -u admin:public -X DELETE "http://localhost:8081/api/v4/clients/123456"
相关推荐
linweidong21 小时前
物联网MQTT协议与实践:从零到精通的硬核指南
物联网·mqtt·websocket·嵌入式·iot·tdengine·工业物联网
月光技术杂谈14 天前
linux下MQTT订阅发布验证-mosquitto安装测试流程
linux·mqtt·订阅·mosquitto·发布·mosquitto_pub·mqtt-clients
慕木兮人可20 天前
关于阿里云-云消息队列MQTT的连接和使用,以及SpringBoot的集成使用
spring boot·物联网·mqtt·阿里云·云计算
Johny_Zhao24 天前
基于CentOS Stream 8的物联网数据采集与展示方案
linux·网络·python·mqtt·mysql·网络安全·信息安全·云计算·shell·yum源·系统运维
长流小哥1 个月前
STM32:ESP8266 + MQTT 云端与报文全解析
stm32·单片机·物联网·mqtt
特立独行的猫a1 个月前
使用 Go 语言实现完整且轻量级高性能的 MQTT Broker
开发语言·后端·mqtt·golang·broker·mqtt-broker
YGGP1 个月前
应用层协议简介:以 HTTP 和 MQTT 为例
mqtt·网络协议·http·rpc
Nerd Nirvana1 个月前
网关GateWay——连接不同网络的关键设备
网络·mqtt·计算机网络·gateway·路由器·modbus·电力设备
bing_1582 个月前
MQTT 在Spring Boot 中的使用
java·spring boot·后端·mqtt
非著名架构师2 个月前
SpringBoot整合MQTT实战:基于EMQX构建高可靠物联网通信,从零到一实现设备云端双向对话
spring boot·mqtt·emqx