如何配置Mosquitto认证插件与PostgreSQL联动?
解决Mosquitto PostgreSQL认证插件配置问题
一、修复插件编译错误
你遇到的编译错误是插件代码中函数参数的const修饰符与系统Mosquitto头文件声明不匹配导致的,修改方法如下:
打开
auth-plug.c文件,找到三个函数定义:mosquitto_auth_unpwd_checkmosquitto_auth_acl_checkmosquitto_auth_psk_key_get
去掉参数中
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)重新执行编译:
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调整
让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容器确保
.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
五、测试验证
- 启动所有容器:
docker-compose up -d - 查看Mosquitto日志,确认插件加载成功:
docker logs mqtt-broker - 测试发布订阅:
若能正常收发消息,说明认证配置生效。docker-compose run mqtt-pub docker-compose run mqtt-sub
内容的提问来源于stack exchange,提问作者FroggerProgger
相关产品推荐
相关产品推荐

