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

EMQX容器集成PostgreSQL认证失败问题排查求助

排查EMQX 4.3.5 PostgreSQL认证失败(not_authorized)步骤

一、检查EMQX数据库认证核心配置

  1. 确认认证查询语句合法性
    EMQX 4.3.5的PostgreSQL认证查询必须返回password字段(对应密码),可选返回salt、is_superuser字段。常见错误点:

    • 字段名不匹配:比如用户表密码字段是passwd,但查询语句写的password
    • 缺失用户名匹配条件:未添加where username = ${username}
      示例正确查询语句:
    SELECT password, salt, is_superuser FROM mqtt_users WHERE username = ${username} LIMIT 1
    

    注意:若密码为加盐哈希存储,需确保EMQX配置的哈希算法(如bcrypt、sha256)与存储时一致。

  2. 验证EMQX-PostgreSQL连接配置
    检查emqx_auth_pgsql插件配置:

    • 数据库地址需用Docker Compose服务名(如postgres),而非localhost
    • 数据库名、用户名、密码需与PostgreSQL容器配置完全匹配
    • 确认插件已启用:登录EMQX控制台(默认18083端口),在Plugins列表中查看emqx_auth_pgsql状态为Running

二、检查Docker Compose网络与数据库权限

  1. 容器网络连通性测试
    进入EMQX容器,测试与PostgreSQL的连通性:

    docker exec -it <emqx容器ID> ping postgres
    docker exec -it <emqx容器ID> psql -h postgres -U <postgres用户名> -d <数据库名>
    

    若无法连接,检查两个容器是否处于同一Docker网络(默认default网络即可,自定义网络需确保双方都加入)。

  2. PostgreSQL用户查询权限
    确认EMQX使用的数据库用户拥有查询用户表的权限:

    GRANT SELECT ON mqtt_users TO <emqx_db_user>;
    

三、验证PostgreSQL数据与密码格式

  1. 检查用户数据有效性
    确认用户表中存在目标用户名的记录,且密码格式匹配EMQX配置:

    • 测试用明文密码:需设置auth.pgsql.password_hash = plain
    • 哈希密码:比如bcrypt格式需存储$2a$xx...的哈希值,且EMQX配置auth.pgsql.password_hash = bcrypt
  2. 手动执行查询语句
    在PostgreSQL中替换${username}为实际用户名,执行EMQX配置的查询语句,确认能返回正确的密码字段:

    SELECT password FROM mqtt_users WHERE username = 'test_user' LIMIT 1;
    

四、客户端与日志细节排查

  1. 客户端连接参数校验
    确认客户端使用用户名/密码认证,而非证书等其他方式;检查端口(1883为TCP,8883为SSL)、clean session等参数是否正确。

  2. EMQX日志深度分析
    查看EMQX详细日志(默认路径/opt/emqx/log/emqx.log.1),筛选auth_pgsql相关条目,确认:

    • 查询语句是否成功执行
    • 查询结果是否为空
    • 密码校验阶段是否出现哈希不匹配提示

内容的提问来源于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 09:13:24