MongoDB 认证失败(错误码 18)

这个错误是 MongoDB 认证失败(错误码 18),核心原因是账号密码不正确认证机制不匹配,导致连接时身份验证失败。以下是具体解决方案:

一、核心原因分析

错误信息明确显示 Authentication failed(认证失败),可能的原因包括:

  1. 用户名或密码错误(最常见);
  2. 账号所在的认证数据库与连接时指定的 source 不匹配;
  3. MongoDB 启用了特定认证机制(如 SCRAM-SHA-1/256),但客户端未正确适配;
  4. 账号没有足够的权限或已被锁定。

二、分步解决方案

1. 验证账号密码正确性(优先排查)

通过 mongo shell 手动登录,确认账号密码是否正确:

bash 复制代码
# 1. 连接 MongoDB 服务(不携带认证信息)
mongo localhost:27017

# 2. 切换到认证数据库(这里是 admin,与连接时的 source 一致)
use admin

# 3. 执行认证(替换为你的账号密码)
db.auth("root", "你的密码")
  • 若返回 1:认证成功,说明账号密码正确,问题出在客户端配置;
  • 若返回 0:认证失败,确认为账号或密码错误,需重置密码。
2. 重置密码(若账号密码错误)

如果确认密码错误,通过 mongo shell 重置:

bash 复制代码
# 1. 先关闭 MongoDB 认证(临时操作,仅用于重置密码)
# 编辑 MongoDB 配置文件(如 /etc/mongod.conf 或 mongod.cfg),注释掉 auth: true
# 重启 MongoDB 服务:systemctl restart mongod(Linux)或 net stop MongoDB && net start MongoDB(Windows)

# 2. 连接后切换到认证数据库(admin)
mongo localhost:27017
use admin

# 3. 重置密码(替换为新密码)
db.changeUserPassword("root", "新密码")

# 4. 重新开启认证(恢复配置文件中的 auth: true),重启服务
3. 检查认证数据库是否匹配

确保连接时指定的 source(认证数据库)与账号实际所在的数据库一致:

  • 若账号是在 admin 库创建的(默认管理员账号),source 必须为 admin
  • 若账号在其他库(如 test)创建,source 需改为对应库名(如 source="test")。

示例(Java 客户端正确配置):

java 复制代码
// 确保 source 与账号所在数据库一致
MongoCredential credential = MongoCredential.createCredential(
    "root", 
    "admin",  // 账号所在的认证数据库,必须正确
    "新密码".toCharArray()
);
4. 适配认证机制(若 MongoDB 版本较高)

MongoDB 3.0+ 默认使用 SCRAM-SHA-1 认证机制,部分旧驱动可能不兼容。解决方案:

  • 升级 MongoDB 客户端驱动到最新版本(推荐 3.10+);

  • 连接时显式指定认证机制(以 Java 为例):

    java 复制代码
    MongoCredential credential = MongoCredential.createScramSha1Credential(
        "root", "admin", "密码".toCharArray()  // 显式使用 SCRAM-SHA-1
    );
5. 检查 MongoDB 服务状态

确保服务正常运行且监听 27017 端口:

  • Linux:systemctl status mongodnetstat -tuln | grep 27017
  • Windows:net start | findstr MongoDBnetstat -ano | findstr "27017"

三、总结

最可能的问题是账号密码错误认证数据库不匹配 。优先通过 mongo shell 验证账号密码,确认正确后检查客户端连接时的 source 配置是否与账号所在数据库一致。若问题仍存在,升级驱动或显式指定认证机制即可解决。

相关推荐
山峰哥1 分钟前
造价算量系统SQL优化,慢查询从9秒压到35毫秒‌
大数据·数据库·sql·编辑器·深度优先
AC赳赳老秦13 分钟前
电力能源公开数据采集实操:用 OpenClaw 合规抓取电网电价与发电量数据,生成区域能源供需分析报告
大数据·数据库·人工智能·python·php·deepseek·openclaw
Discipline~Hai1 小时前
Linux网络编程05-sqlite3数据库
linux·c语言·网络·数据库·sqlite·linux应用软件编程
青禾8371 小时前
一文入门 MySQL + MongoDB + Redis:三大数据库核心知识
数据库·mysql·mongodb
努力努力再努力wz1 小时前
【Redis入门系列】:从 RESP 协议到 redis-plus-plus:Redis 客户端编程与 C++ 接口设计
开发语言·数据库·c++·redis·分布式·缓存·架构
志栋智能1 小时前
凌晨3点的告警,如何用AI在5分钟内完成定界?
运维·服务器·数据库·人工智能·自动化
G.E.M.小白1 小时前
【SQLite3 数据库】从安装、SQL 操作到 C/C++ API 实战
数据库·oracle·sqlite3
神明不懂浪漫1 小时前
【第一章】MySQL简介
数据库·经验分享·笔记·mysql·oracle
山岚的运维笔记2 小时前
mysql 专业笔记 -- 第 14 章:GROUP BY
运维·数据库·笔记·后端·学习·mysql·dba
zcn1262 小时前
不同列or运算优化经验
数据库·sql优化改写