mosquitto-go-auth JWT JS模式:checkAcl的acc参数及自定义ACL问询
使用mosquitto-go-auth的JS模式JWT后端实现动态ACL配置问题解答
问题1:checkAcl函数的acc参数来源是什么?是否需要手动定义?
acc参数由mosquitto-go-auth插件自动传入,无需手动定义。- 它对应MQTT客户端发起的操作类型,值直接映射你提到的mosquitto ACL常量:
0x01=MOSQ_ACL_READ(读操作)0x02=MOSQ_ACL_WRITE(写操作)0x04=MOSQ_ACL_SUBSCRIBE(订阅操作)0x00=MOSQ_ACL_NONE(无权限操作)
插件会根据客户端的具体行为自动传递对应数值到checkAcl函数中。
问题2:如何基于username和Topic设置自定义ACL,例如允许用户订阅或读取topic/${username}/#?
你可以在jwt_js_acl_script中编写checkAcl函数,利用JWT Claims中的username、传入的topic和acc参数实现规则匹配,示例代码如下:
function checkAcl(username, topic, acc) { // 构造匹配用户专属主题的正则表达式 const allowedTopicRegex = new RegExp(`^topic/${username}/.*$`); // 允许读(0x01)和订阅(0x04)操作访问匹配的主题 if ((acc === 0x01 || acc === 0x04) && allowedTopicRegex.test(topic)) { return true; } // 其他操作或不匹配的主题默认拒绝 return false; }
- 核心逻辑:
- 插件会自动从JWT Claims中提取
username并传入checkAcl函数 - 用正则匹配符合
topic/${username}/#格式的主题(.*等价于MQTT的#通配符) - 判断当前操作是否为读或订阅,同时主题匹配则返回
true允许操作,否则返回false拒绝
- 插件会自动从JWT Claims中提取
内容的提问来源于stack exchange,提问作者pumpum
相关产品推荐
相关产品推荐

