基于 HTTP 应用进行授权,设置后未生效

环境

  • EMQX 版本:5.0.26
  • 操作系统版本:docker



image

重现此问题的步骤

  1. xxx
  2. xxx
  3. xxx

预期行为

实际行为

未生效是指什么现象呢?

没有回调

authz_file 排在了 authz_http 前面,请检查下 authz_flie 中有没有配置对应主题的鉴权规则。
另外设计上为了避免对外部数据库/http_server 多次重复访问造成性能瓶颈,设计了 authz 缓存来避免这种现象。
可以在 Dashboard 的 “客户端授权” 页面右上角的配置子页面中手动清除或关闭 authz 缓存再次尝试。

起作用了,但是http服务返回deny,发布仍然可以进行
{“level”:“info”,“ts”:“2023-06-25T12:00:36+08:00”,“caller”:“emqxControl/emqx.go:46”,“msg”:“{Clientid:mqttx_884d95c6 Username:emqx Topic:test/1 Action:publish}”}
2023/06/25 - 12:00:36 | 500 | 509.5µs | 192.168.1.115 | GET “/emqx/authz?action=publish&clientid=mqttx_884d95c6&topic=test%2F1&username=emqx”

{
“result”: “deny”
}

返回的 http status code 是多少,如果是 204 会忽略返回的 http body

200,204,400,500都有尝试,都没有起到禁止发布的作用,使用的测试工具是online-mqtt-client

“没有起到禁止发布的作用” 结论是观察什么现象得出的?
是其他订阅了这个主题的客户端仍然能够收到 这个被禁止发布的客户端 发布的消息。
还是说客户端没有收到带有 not_authorized 原因码的 puback 报文?

此外请检查下日志
如果被鉴权失败拒绝发布,会有一条 warning 日志打印。

2023-06-25T16:17:45.737430+08:00 [warning] msg: cannot_publish_to_topic, mfa: emqx_channel:process_publish/2, line: 648, peername: 127.0.0.1:27988, clientid: abc, topic: test/1, reason: not_authorized

客户端没有收到带有 not_authorized 原因码的 puback 报文。debug日志已开,未发现cannot_publish_to_topic日志

看到这条日志了

image
既然鉴权失败拒绝发布,发布端为什么展示出来了,不应该是侧边给个提示就好了?

PUB QoS 为 0 的消息,是没有 PUBACK 的,对于发布客户端来说,在 tcp 层面确认消息已经发给 boker 就之后,整个发布流程就结束了,消息鉴权和投递都由 broker 处理。

因为在 MQTT 协议规范中,qos0 为最低等级的 qos,消息丢失和重复对于发布者来说都是可以接受的。
你可以尝试使用 qos1 发布消息,MQTTX 收到 not_authorized 的 PUBACK 后会进行提示。

已确认,确实如此,谢谢你的耐心解答 :handshake: