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

如何配置Mosquitto认证插件与PostgreSQL联动?

解决Mosquitto PostgreSQL认证插件配置问题

一、修复插件编译错误

你遇到的编译错误是插件代码中函数参数的const修饰符与系统Mosquitto头文件声明不匹配导致的,修改方法如下:

  1. 打开auth-plug.c文件,找到三个函数定义:

    • mosquitto_auth_unpwd_check
    • mosquitto_auth_acl_check
    • mosquitto_auth_psk_key_get
  2. 去掉参数中struct mosquitto*前的const修饰符,修改后示例:

    int mosquitto_auth_unpwd_check(void *userdata, struct mosquitto *client, const char *username, const char *password)
    
    int mosquitto_auth_acl_check(void *userdata, int access, struct mosquitto *client, const struct mosquitto_acl_msg *msg)
    
    int mosquitto_auth_psk_key_get(void *userdata, struct mosquitto *client, const char *hint, const char *identity, char *key, int max_key_len)
    
  3. 重新执行编译:

    make clean && make
    

    编译完成后会生成auth-plug.so插件文件。

二、PostgreSQL数据库配置

在init-mqtt-auth-db.sh中添加认证所需的表结构和测试数据:

-- 创建用户表
CREATE TABLE IF NOT EXISTS mqtt_users (
    username VARCHAR(255) PRIMARY KEY,
    password VARCHAR(255) NOT NULL,
    superuser BOOLEAN DEFAULT FALSE
);

-- 创建ACL规则表
CREATE TABLE IF NOT EXISTS mqtt_acl (
    username VARCHAR(255) REFERENCES mqtt_users(username),
    topic VARCHAR(255) NOT NULL,
    rw INT NOT NULL CHECK (rw IN (0,1,2)) -- 0=只读,1=只写,2=读写
);

-- 插入测试用户(生产环境务必用mosquitto_passwd生成哈希密码)
INSERT INTO mqtt_users (username, password, superuser) 
VALUES ('Frog', '1234', FALSE);

-- 插入测试ACL规则
INSERT INTO mqtt_acl (username, topic, rw)
VALUES ('Frog', 'test/#', 2);

执行chmod +x init-mqtt-auth-db.sh确保脚本可执行,PostgreSQL容器启动时会自动初始化这些表。

三、Mosquitto配置修改

修改mosquitto.conf,启用插件并配置PostgreSQL连接:

# 禁用匿名访问
allow_anonymous false

# 加载认证插件
plugin /mosquitto/auth-plug.so

# PostgreSQL连接配置
plugin_opt_auth_psql_host postgres_container
plugin_opt_auth_psql_port 5432
plugin_opt_auth_psql_dbname ${DATABASE_NAME}
plugin_opt_auth_psql_user ${DATABASE_USER}
plugin_opt_auth_psql_pass ${DATABASE_PASSWORD}

# 用户查询语句
plugin_opt_auth_psql_userquery "SELECT password FROM mqtt_users WHERE username = $1 LIMIT 1"
# 超级用户查询语句
plugin_opt_auth_psql_superquery "SELECT superuser FROM mqtt_users WHERE username = $1 LIMIT 1"
# ACL规则查询语句
plugin_opt_auth_psql_aclquery "SELECT topic, rw FROM mqtt_acl WHERE username = $1 OR username = '$' OR username = ''"

四、Docker Compose调整

  1. 让Mosquitto容器加入postgres网络,映射编译好的插件文件:

    mqtt-broker:
      image: eclipse-mosquitto:latest
      user: root # 临时用root确保插件文件权限,生产环境可调整文件权限后改回mosquitto用户
      volumes:
        - ./mosquitto/config/mosquitto.conf:/mosquitto/config/mosquitto.conf
        - ./mosquitto/config/password.txt:/mosquitto/password.txt
        - ./mosquitto/log:/mosquitto/log
        - data:/mosquitto/data
        - ./auth-plug.so:/mosquitto/auth-plug.so # 映射本地编译的插件到容器内
      ports:
        - "1883:1883"
        - "9001:9001"
      networks:
        - mqtt-net
        - postgres # 加入postgres网络,允许访问PostgreSQL容器
    
  2. 确保.env文件正确配置数据库参数:

    DATABASE_NAME=your_db_name
    DATABASE_USER=your_db_user
    DATABASE_PASSWORD=your_db_pass
    PG_DEFAULT_EMAIL=admin@example.com
    PG_DEFAULT_ADMIN_PASSWORD=admin
    

五、测试验证

  1. 启动所有容器:
    docker-compose up -d
    
  2. 查看Mosquitto日志,确认插件加载成功:
    docker logs mqtt-broker
    
  3. 测试发布订阅:
    docker-compose run mqtt-pub
    docker-compose run mqtt-sub
    
    若能正常收发消息,说明认证配置生效。

内容的提问来源于stack exchange,提问作者FroggerProgger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 17:22:46