You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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官方工具测试:

  1. 测试非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
  1. 测试非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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 11:04:53