发布订阅 ACL 指对 发布 (PUBLISH)/订阅 (SUBSCRIBE) 操作的 权限控制。例如拒绝用户名为 Anna 向 主题 open/elsa/door 发布消息。
内置 ACL
使用配置文件提供认证数据源,适用于变动较小的 ACL 管理。
通过修改配置文件设置ACL。
MySQL ACL
PostgreSQL ACL
Redis ACL
MongoDB ACL
外部数据库可以存储大量数据、动态管理 ACL,方便与外部设备管理系统集成。
通过查询数据库判断用户是否有发布与订阅的权限。
HTTP ACL
HTTP ACL 能够实现复杂的 ACL 管理。
ACL 功能包含在认证鉴权插件中,更改插件配置后需要重启插件才能生效。
通过java搭建一个HTTP ACL服务器,使用服务器判断是否具有收发权限。(需要通过配置文件绑定HTTP ACL服务器)
默认全部用户都能收发。我们可以通过修改配置文件进行更改。
[root@iz2zedg4ylq9iqtwm11wecz etc]# pwd
/my/emqx/conf/etc
[root@iz2zedg4ylq9iqtwm11wecz etc]# ls
acl.conf emqx.conf plugins ssl_dist.conf
certs lwm2m_xml psk.txt vm.args
[root@iz2zedg4ylq9iqtwm11wecz etc]# vim emqx.conf
此处我们需要修改全局配置文件中关于acl的配置,将 acl_nomatch 配置项的值改为: deny
完成配置后使用 emqx restart 重启emqx broker服务
配置ACL规则:
%% 拒绝 "所有用户" 订阅 "$SYS/#" "admin" 主题
{deny, all, subscribe, ["$SYS/#", {eq, "admin"}]}.
# 重启emqx
[root@iz2zedg4ylq9iqtwm11wecz ~]# docker restart myemqx
myemqx
**测试:**使用lihua这个用户订阅主题为admin的消息。
可以直接看**官网教程**
## Allow-Deny Who Pub-Sub Topic
"允许(Allow) / 拒绝(Deny)" "谁(Who)" "订阅(Subscribe) / 发布(Publish)" "主题列表(Topics)"
也就是用户在没有匹配ACL规则时,默认给他一个兜底的规则。这个兜底的规则可以是授权(allow )\拒绝(deny)
# etc/emqx.conf
## ACL 未匹配时默认授权
## Value: allow | deny
acl_nomatch = allow
默认ACL的配置文件是etc/acl.conf,当然你也可以自定义
# etc/emqx.conf
acl_file = etc/acl.conf
直接看官网:
https://docs.emqx.cn/broker/v4.3/advanced/acl-file.html#acl-conf-%E7%BC%96%E5%86%99%E8%A7%84%E5%88%99
在修改acl.conf 文件后需要重新载入规则
# 进入docker容器
[root@iz2zedg4ylq9iqtwm11wecz ~]# docker exec -it myemqx /bin/bash
# 直接执行下面这条命令即可
bash-5.0$ ./bin/emqx_ctl modules reload emqx_mod_acl_internal
Module emqx_mod_acl_internal reloaded successfully.
使用 vs code http 发送请求,之前的文章有教程。
示例:
###########添加ACL规则#############
POST http://{{hostname}}:{{port}}/api/v4/acl HTTP/1.1
Content-Type: {{contentType}}
Authorization: Basic {{userName}}:{{password}}
# 注意:这里要空一行
{
"clientid":"mqttjs_9a5c5ba78d",
"topic":"Topic/A",
"action":"pub",
"access": "allow"
}
HTTP/1.1 200 OK
connection: close
content-length: 114
content-type: application/json
date: Mon, 25 Oct 2021 08:34:40 GMT
server: Cowboy
{
"data": {
"topic": "Topic/A",
"result": "ok",
"clientid": "mqttjs_9a5c5ba78d",
"action": "pub",
"access": "allow"
},
"code": 0
}
更多可以参考**官网**按照实例进行修改即可