Eclipse Mosquitto 2.0.15全局用户ACL规则配置失败求助
Eclipse Mosquitto 2.0.15 通用ACL规则配置问题
需求
为所有用户配置ACL规则:
- 允许订阅所有
/c2d/开头的主题(如/c2d/config/get/0123456789A) - 允许发布所有
/d2c/开头的主题
已尝试的配置及问题
初始ACL配置
# 给admin全部权限 user admin topic readwrite # # 尝试允许所有用户读写指定主题 topic readwrite all users /c2d/# topic readwrite all users /d2c/#
问题:非admin用户无法接收/c2d/开头的主题消息。
修改后的ACL配置
改用pattern规则后:
# 给admin全部权限 user admin topic readwrite # # 注释旧规则,改用pattern #topic readwrite all users /c2d/# #topic readwrite all users /d2c/# pattern readwrite /c2d/# pattern readwrite /d2c/#
执行docker kill --signal=HUP mqtt-container重载配置后,问题依旧。
测试用Python订阅代码
仅admin用户能正常接收消息,非admin用户无响应:
def on_message(client, userdata, msg): payload_string = msg.payload.decode("utf-8") payload_json = json.loads(payload_string) topic = msg.topic print(f"receive topic: {topic}") try: if topic == f'/c2d/info/{MAC}': payload = get_c2d_info_payload() client.publish(f"/d2c/info/{MAC}", json.dumps(payload)) except json.JSONDecodeError as e: print(f"Error decoding JSON: {e}") except Exception as e: print(e) if __name__ == '__main__': try: client = mqtt.Client() client.on_connect = on_connect client.username_pw_set(username='user2', password='xxxx') client.tls_set(ca_certs="./mqtt_ssl/ca.crt", certfile="./mqtt_ssl/client.crt", keyfile="./mqtt_ssl/client.key", cert_reqs=ssl.CERT_REQUIRED, tls_version=ssl.PROTOCOL_TLS) client.tls_insecure_set(True) client.on_message = on_message client.connect(MQTT_HOST, MQTT_PORT, 60) print(f'EW50 {MAC} simulator started successfully.') return_code = client.loop_forever()
解决方案
1. 修正ACL权限规则
按需求拆分读写权限,避免冗余:
# 给admin全部权限 user admin topic readwrite # # 所有用户允许订阅/c2d开头的主题 pattern read /c2d/# # 所有用户允许发布/d2c开头的主题 pattern write /d2c/#
2. 检查Mosquitto核心配置
确保mosquitto.conf中正确启用ACL:
# 指定ACL文件路径 acl_file /etc/mosquitto/aclfile.conf # 禁用匿名访问(必须开启,否则用户名密码认证失效) allow_anonymous false # 无匹配ACL规则时拒绝操作 acl_none_kill true
3. 确认客户端订阅操作成功
在on_connect回调中添加订阅日志,排查是否订阅失败:
def on_connect(client, userdata, flags, rc): print(f"连接返回码: {rc}") # 订阅/c2d/#主题并打印结果 result, mid = client.subscribe("/c2d/#", qos=0) print(f"订阅结果: {result}") # result=0表示订阅成功,非0则为权限不足或其他错误
4. 确保配置生效
HUP信号重载可能因容器进程问题失效,直接重启容器更可靠:
docker restart mqtt-container
5. 验证用户存在性
确认user2已在密码文件中:
# 进入容器查看密码文件 docker exec mqtt-container cat /etc/mosquitto/passwd # 或验证密码文件格式 docker exec mqtt-container mosquitto_passwd -U /etc/mosquitto/passwd
快速验证
使用Mosquitto官方工具测试:
- 测试非admin用户订阅:
mosquitto_sub -h <MQTT_HOST> -p <MQTT_PORT> -u user2 -P xxxx -t "/c2d/#" --cafile ./mqtt_ssl/ca.crt --cert ./mqtt_ssl/client.crt --key ./mqtt_ssl/client.key
- 测试非admin用户发布:
mosquitto_pub -h <MQTT_HOST> -p <MQTT_PORT> -u user2 -P xxxx -t "/d2c/test/123" -m "test payload" --cafile ./mqtt_ssl/ca.crt --cert ./mqtt_ssl/client.crt --key ./mqtt_ssl/client.key
内容的提问来源于stack exchange,提问作者YUN-XIN
相关产品推荐
相关产品推荐

