必须开启 security.authorization: enabled,否则即使创建用户也无法触发认证;未启用时任何客户端均可无密码直连并执行任意操作,根本原因在于mongodb默认关闭认证机制。

必须开启 authorization: enabled,否则无论是否配置用户,任何客户端都能直连并执行任意操作——这不是“忘记密码”的问题,而是认证机制根本没启动。
为什么加了用户还是能无密码登录
常见错误是只创建了用户,但没在配置文件中启用授权。MongoDB 默认关闭认证,db.createUser() 只是把用户写进 admin.system.users,不触发校验逻辑。即使你删掉所有用户,只要 authorization 关着,照样能连、能读写、能 dropDatabase()。
- 检查配置文件(如
/etc/mongod.conf)里是否有security.authorization: enabled(注意缩进,YAML 对齐敏感) - 确认修改后执行了
sudo systemctl restart mongod或等效重启命令 - 重启后用
mongosh --eval "db.runCommand({connectionStatus: 1})"查看输出中的authEnabled: true
连接时提示 Authentication failed 的真实原因
不是密码错了,而是 --authenticationDatabase 指错了库。MongoDB 用户是绑定到特定数据库的:你在 admin 库创建的用户,就必须用 --authenticationDatabase admin;在 myapp 库创建的用户,就得用 --authenticationDatabase myapp。
- 用户角色决定权限范围,但认证数据库(
authSource)决定凭据在哪查 - Python 驱动里对应的是
authSource参数,不是database参数 - 用
mongosh --username root --password xxx --authenticationDatabase admin测试最稳妥
开发环境想临时免密但又不暴露风险
不要关 authorization,而应限制网络访问面:
- 在
mongod.conf中设置bindIp: 127.0.0.1(禁用0.0.0.0) - 确保防火墙屏蔽 27017 端口对外网开放
- 这样本地工具(如
mongosh、Robot3T)仍可直连,但外网无法扫描命中 - 上线前必须切回带密码 +
authSource的完整流程,别依赖“反正只跑内网”
最容易被忽略的是:开启 authorization 后,mongosh 连上默认会进 test 库,而你创建的管理员一定在 admin 库——此时直接运行 db.auth() 会失败,必须先 use admin 再 db.auth("root", "xxx")。这个切换步骤没有容错提示,很多人卡在这一步就以为配置坏了。











