Mosquitto-go-auth结合PostgreSQL认证失败问题求助
排查Mosquitto + mosquitto-go-auth + PostgreSQL认证失败问题
根据你描述的日志提示error: received null username or password for unpwd check,核心问题是Mosquitto的认证插件未正确接收到传入的用户名/密码,或插件配置存在问题导致无法正常验证。以下是具体排查步骤:
1. 确认Mosquitto核心认证配置
- 检查
mosquitto.conf是否开启强制认证:
若allow_anonymous no password_file noneallow_anonymous设为yes,Mosquitto会跳过认证流程,导致插件无法触发;同时需禁用默认的password_file,确保使用插件认证。 - 确认插件加载路径正确(建议用绝对路径避免路径解析问题):
plugin /usr/lib/mosquitto-go-auth.so plugin_opt pg_enabled true
2. 验证mosquitto-go-auth的PostgreSQL查询配置
- 检查
pg_userquery参数是否匹配你的数据库结构:
确保表名、字段名与PostgreSQL中的实际结构完全一致(注意大小写,PostgreSQL对带引号创建的表/字段区分大小写)。plugin_opt pg_userquery "SELECT password_hash FROM test_user WHERE username = $1 LIMIT 1;" - 确认数据库连接参数正确:
用上述参数通过plugin_opt pg_host localhost plugin_opt pg_port 5432 plugin_opt pg_dbname your_db_name plugin_opt pg_user your_db_user plugin_opt pg_password your_db_passwordpsql手动连接数据库,验证是否能正常访问:psql -h localhost -p 5432 -U your_db_user -d your_db_name
3. 检查PostgreSQL权限与数据有效性
- 确保插件使用的数据库用户对
test_user表拥有SELECT权限:GRANT SELECT ON test_user TO your_db_user; - 手动执行用户查询,验证返回的哈希值是否正确:
用bcrypt工具验证密码与哈希的匹配性,比如Python脚本:SELECT password_hash FROM test_user WHERE username = 'Frogger';
确保输出为import bcrypt password = b"1234" hash_from_db = b"$2a$16$..." # 替换为数据库中的哈希值 print(bcrypt.checkpw(password, hash_from_db))True。
4. 排查客户端命令与日志细节
- 简化
mosquitto_sub命令,避免shell引号解析问题:mosquitto_sub -h localhost -t test -u Frogger -P 1234 - 调高Mosquitto日志等级到
all,获取更详细的认证流程信息:
在mosquitto.conf中添加:
重启Mosquitto后再次尝试订阅,查看日志中是否有插件与数据库交互的错误(如查询失败、权限不足等)。log_type all
5. 确认插件注册状态
- 执行
mosquitto -v前台启动Mosquitto,查看启动日志是否明确显示:
确保所有PostgreSQL相关检查器正常注册,无加载失败提示。Registered postgres backend Registered postgres user checkers Registered postgres acl checkers
内容的提问来源于stack exchange,提问作者FroggerProgger
相关产品推荐
相关产品推荐

