MQTT鉴权方案比较

目前想实现MQTT ACL,Topic有固定的规则可循。Topic含有设备名,鉴权策略:设备只允许订阅和发布只属于自己的Topic。eg: /product_key/device_name/user/update

方案有两种:

  1. 使用文件ACL+外部数据库
  2. 使用ExHook, 只需解析Topic,判断鉴权是否通过

方案一:灵活性比较高,但设备比较多,需要维护的规则也多
方案二:灵活性比较低,且可用性依赖于grpc server, 但不需要依赖文件或者外部数据库

在鉴权策略和Topic固定的前提下,个人倾向于方案二,但是对grpc 的调用失败和钩子函数引入过多的性能问题有点担忧。

不知道EMQX官方是否有啥好的建议

如果只是根据主题中的设备名来判断,并且主题具有类似的模式,建议使用文件 ACL。因为你可以在规则中使用占位符,例如:

{allow, all, pubsub, ["/product_key/%c/user/update"]}.

{deny, all}.

占位符不适用,因为我的设备名只是clientid 或者 username 的一部分