当前位置: 首页 > news >正文

为什么mosquitto 禁用了 topic “#“后,无法使用主题中包含%c client_id了?

禁用通配符主题#后无法使用%c占位符的问题,主要涉及Mosquitto的ACL权限机制与动态占位符的逻辑冲突。具体原因如下:

  1. ‌通配符与动态占位符的依赖关系‌
    ‌#通配符的作用‌:通配符#允许订阅多级模糊匹配主题(如sensor/#可订阅所有以sensor/开头的主题)7。
    ‌%c占位符的特性‌:%c用于在主题中动态替换为连接客户端的client_id(如订阅sensor/%c/data会替换为sensor/client123/data)。此功能依赖于客户端连接时动态生成主题路径的能力4。
  2. ‌通配符禁用后的权限限制‌
    当禁用#通配符时,ACL规则要求客户端必须‌明确指定完整主题路径‌。此时动态生成的%c占位符无法通过模糊匹配验证,因为系统要求主题必须完全静态且可预判27。
    例如:若ACL配置为禁止#,则客户端试图订阅sensor/%c/data时,Mosquitto会检查主题是否包含通配符或动态占位符,发现%c可能隐含动态匹配逻辑(即使实际生成的是静态主题),触发权限拒绝24。
  3. ‌解决方法‌
    需调整ACL规则以兼容动态占位符:

conf
Copy Code

允许客户端使用自身client_id动态生成主题

pattern write sensor/%c/#
此规则明确允许客户端在sensor/%c/路径下动态生成子主题,同时避免使用全局通配符#27。

比如:
topic write v2/s/+/%c/status
#topic read v2/c/%c/cmd
这一行不行,
改成:
pattern write v2/s/+/%c/#
pattern read v2/c/%c/#
可以了。

完整的:

#topic write v2/s/+/%c/status
pattern write v2/s/+/%c/#
topic write +/+/status
#topic read v2/c/%c/cmd
pattern read v2/c/%c/#
#topic read +/cmd
pattern read %c/#
topic deny $SYS/#
#topic deny #

这样实现了匿名用户根据client_id动态订阅主题。并且让“#”主题无法查看到信息。

mosquitto_sub -h mqtt.xxxx.hk -p 8883 -v -t '#'

相关文章:

  • 【动手学深度学习】2.1. 数据操作
  • 技术篇-2.4.Python应用场景及开发工具安装
  • 如果验证集缺失或测试集缺失应该怎么办?
  • Cursor远程连接+工具使用
  • redis-7.4.2 通过 systemd管理,rpmbuild spec文件参考
  • 关于初学者对大模型的一些概念的理解
  • 纳斯达克与标普500的技术博弈:解析美股交易系统的低延迟与高安全解决方案
  • java后端-海外登录(谷歌/FaceBook/苹果)
  • 高等数学-空间中的曲线与曲面
  • React 第四十六节 Router中useInRouterContext的使用详细介绍及注意事项
  • 价格行为(PriceAction)复盘 - Google - 250521
  • 嵌入式自学第二十六天(5.22)
  • C#中WSDL文件引用问题
  • 爱博精电正式入驻京东平台,为客户提供更高效、便捷的采购体验
  • RocketMQ 中的 ConsumeQueue:消息消费的关键索引
  • Java单例模式终极指南:从原理到防御性编程
  • Python描述统计分析
  • PTA刷题笔记
  • 变上限积分是被积函数的一个原函数
  • 多用户批发商城系统哪个好?商淘云S2B2b多供应商批发源码评测
  • 服装企业网站策划书/商品关键词优化的方法
  • 北京网站建设方案书/网络广告名词解释
  • 佛山高端网站建设公司/百度竞价开户3000
  • 上海网站制作工作室/常州网站seo
  • 怎样做网站平台赚钱/西安seo哪家好
  • 找做废薄膜网站/房地产网站建设