emqx 5.0.17 普通用户客户端连接后,一订阅topic客户端MQTTX就断开连接

环境

  • EMQX 版本:5.0.17(官方镜像)
  • 操作系统版本:CentOS 7.9
  • 操作系统内核版本: 6.1

重现此问题的步骤

  1. docker-compose内容
version: "3"

services:
  emqx:
    image: emqx:5.0.17
    container_name: emqx
    restart: always
    network_mode: "host"
    privileged: true
    environment:
      "EMQX_NAME": "emqx-sit-srv3"
      "EMQX_HOST": "xt-emqtt-srv3.sit.bbb.cn"
      "EMQX_NODE__NAME": "emqx-sit-srv3@xt-emqtt-srv1.sit.bbb.cn"
      "EMQX_NODE__COOKIE": "xtsitsecretcookie"
      "EMQX_ALLOW_ANONYMOUS": "false"
      "EMQX_BROKER__SHARED_SUBSCRIPTION_STRATEGY": "hash_clientid"
    volumes:
      - "/data/emqx/etc/emqx.conf:/opt/emqx/etc/emqx.conf:rw"
      - "/data/emqx/etc/acl.conf:/opt/emqx/etc/acl.conf:rw"
      - "/data/emqx/data:/opt/emqx/data:Z"
      - "/data/emqx/log:/opt/emqx/log:Z"
  1. 普通用户订阅topic后客户端就断开连接
    docker-compose部署的emqx 5.0.17,dashboard授权中,ACL规则将一个普通用户设置了和超级用户一样的topic策略,但是普通用户订阅topic就导致客户端断开连接,超级用户可以正常连接并发布订阅topic。

yyw 设置为超级用户,客户端可以正常连接并发布订阅topic

app 设置为普通用户,客户端可以正常连接,但是一旦新建订阅,就会提示Error connect,并且客户端直接断开连接


正常发布订阅 topic 然后手动断开连接的日志

新建订阅后,点击更新,马上断开客户端连接了


日志提示授权权限被拒绝,客户端主动断开日志

看上去我acl配置中授权也没有问题呀

  1. acl.conf 内容
{allow, {username, "^dashboard?"}, subscribe, ["$SYS/#"]}.

{allow, {ipaddr, "127.0.0.1"}, all, ["$SYS/#", "#"]}.

{allow, {user, "admin"}, all, ["$SYS/#","#"]}.

{allow, {user, "yyw"}, all, ["%c/device"]}.

{allow, {user, "app"}, all, ["%c/device"]}.

{deny, all}.

预期行为

acl 中 设置授权规则 {allow, {user, “app”}, all, [“%c/device”]}. 后,客户端连接以后通过可以正常发布和订阅 clientid/device 类型的topic。

实际行为

授予了这条规则 {allow, {user, “app”}, all, [“%c/device”]}. 之后,客户端能连接,但是一旦订阅 clientid/device 类型的topic 客户端就直接断开,容器报错: authorization permission denied。并且我尝试将最后 {deny, all}. 的规则去掉,app用户也还是 一订阅就失败。

请问下这是什么原因呢?是因为新版本的 emqx 没有开启认证插件导致的吗?如果是的话,那老版本可以在 load_plugins 中添加所需要的插件,新版本在哪里添加这个插件呢?我看dashboard上可以增加插件,但是好像需要下载插件,那这个插件从哪里下载?


你好,5.0 中占位符的格式改为了 ${clientid} 这种形式,%c 这种已经不在支持了。

5.0 不需要添加插件,具体可以参考 授权 文档

能否给一个具体的例子呢?我看授权的文档上没有clientid的例子。谢谢

就是直接把你现在主题中的 %c 替换成 ${clientid},比如 ${clientid}/testtopic

那这种 %u 的形式,改了吗?{allow, all, publish, [“%u/public/#”]}. 如果改了 能否也给个例子

可以看下这个文档:简介 | EMQX 5.0 文档