mosquitto-go-auth开启缓存后仍重复调用认证脚本问题排查
Mosquitto-go-auth缓存未生效:重复订阅仍触发JS认证脚本
问题场景
我运行iegomez/mosquitto-go-auth:latest-mosquitto_2.0.14镜像,使用以下配置开启了认证缓存,但同一用户重复发起相同订阅请求时,superuser.js和acl.js脚本仍会被重复调用(已通过脚本内console.log输出确认),不符合缓存结果复用的预期:
persistence true persistence_location /persistence per_listener_settings true # ---- Default listener, SSL/TLS Support listener 8883 cafile /etc/mosquitto/certs/ca.crt certfile /etc/mosquitto/certs/server.crt keyfile /etc/mosquitto/certs/server.key use_identity_as_username true require_certificate true auth_plugin /etc/mosquitto/go-auth.so auth_opt_backends js auth_opt_cache true auth_opt_cache_type go-cache auth_opt_auth_cache_seconds 300 auth_opt_acl_cache_seconds 300 auth_opt_auth_jitter_seconds 30 auth_opt_acl_jitter_seconds 30 auth_opt_js_user_script_path /etc/mosquitto/auth/user.js auth_opt_js_superuser_script_path /etc/mosquitto/auth/superuser.js auth_opt_js_acl_script_path /etc/mosquitto/auth/acl.js
排查与解决方案
1. 确认缓存键的一致性
mosquitto-go-auth的缓存键由**用户名、客户端ID、操作类型(如订阅主题)**等字段组合生成。如果两次订阅请求的客户端ID不同,会生成不同的缓存键,导致缓存不命中。务必确保重复请求使用相同的客户端ID。
2. 确保缓存配置作用于目标监听器
由于配置了per_listener_settings true,全局的缓存配置可能未正确应用到8883监听器。尝试将缓存相关配置移到listener 8883块内部,明确作用范围:
listener 8883 # ... TLS配置保持不变 use_identity_as_username true require_certificate true auth_plugin /etc/mosquitto/go-auth.so auth_opt_backends js # 缓存配置移至监听器内部 auth_opt_cache true auth_opt_cache_type go-cache auth_opt_auth_cache_seconds 300 auth_opt_acl_cache_seconds 300 auth_opt_auth_jitter_seconds 30 auth_opt_acl_jitter_seconds 30 auth_opt_js_user_script_path /etc/mosquitto/auth/user.js auth_opt_js_superuser_script_path /etc/mosquitto/auth/superuser.js auth_opt_js_acl_script_path /etc/mosquitto/auth/acl.js
3. 检查缓存初始化日志
查看容器运行日志,确认go-cache是否成功初始化。如果插件加载时出现缓存初始化错误,会自动退化为无缓存模式,此时需要排查缓存依赖或配置参数是否正确。
4. 验证订阅主题完全匹配
两次订阅的主题必须完全一致(包括通配符、大小写、斜杠数量),任何细微差异都会被视为不同的请求,导致缓存不命中。
5. 确认superuser结果是否被缓存
部分场景下,superuser验证可能未被纳入缓存逻辑。可以查看mosquitto-go-auth的源码确认superuser结果的缓存处理,或调整脚本逻辑,将superuser判断合并到ACL脚本中,统一利用ACL缓存。
内容的提问来源于stack exchange,提问作者Christian Fritz
相关产品推荐
相关产品推荐

