pymongo连接失败时authsource参数必须显式指定,绝大多数authentication failed错误源于认证源与用户实际所在数据库不一致:用户在admin库创建则需authsource="admin",在业务库创建则authsource须等于该库名。

PyMongo连接失败时authSource参数必须显式指定
绝大多数OperationFailure: Authentication failed错误,不是密码错了,而是PyMongo默认去哪个库做认证没对上。MongoDB服务端要求用户凭证必须在某个特定数据库下验证,这个库就是authSource——它和你要操作的业务库(比如myapp)可以完全不同。
常见错误现象是:用mongo命令行能连上,Python脚本却报错;或者NoSQLBooster等GUI工具能连,pymongo.MongoClient初始化后一调list_collection_names()就崩。
- 如果你的用户是在
admin库创建的(Atlas默认、自建集群常见),但连接字符串里没写authSource=admin,PyMongo会默认去目标库(如myapp)里找用户,自然找不到 - 如果用户建在
myapp库下,而你又写了authSource=admin,同样失败——认证源和用户所在库不一致 -
mongodb+srv://协议下,authSource不能通过URL query 参数传(如?authSource=admin),它会被忽略;必须用authSource关键字参数传给MongoClient
正确写法示例:
from pymongo import MongoClient <h1>✅ 用户在 admin 库中创建</h1><p>client = MongoClient( "mongodb+srv://user:pass@cluster.mongodb.net/", authSource="admin" )</p><h1>✅ 用户在 myapp 库中创建(非admin)</h1><p>client = MongoClient( "mongodb://user:pass@localhost:27017/myapp", authSource="myapp" )</p>
不同部署场景下authSource的取值逻辑
你填什么值,取决于用户账户在哪建的,而不是你想访问哪个库。这个细节被很多人凭直觉猜错。
- MongoDB Atlas:所有数据库用户都必须建在
admin库,所以authSource固定为"admin" - 本地或私有部署的单节点:默认用户建在
admin,但你可以用db.createUser({user:"u", pwd:"p", roles:[{role:"readWrite", db:"mydb"}]})在任意库建用户;此时authSource必须等于该用户的db字段值 - 副本集或分片集群:认证必须走
admin库,authSource只能是"admin",哪怕用户角色只针对某个业务库
查证方式(进mongo shell执行):
// 看当前用户在哪注册的
db.runCommand({connectionStatus: 1}).authInfo.authenticatedUsers
<p>// 或者直接查 admin 库里的用户(需有权限)
use admin
db.system.users.find({user: "your_user"}).pretty()</p>
使用authenticate()方法时也要配对authSource
如果你不用连接字符串带凭据的方式,而是先连再认证(比如要复用连接对象、或动态切用户),那authenticate()调用时也得把authSource带上,否则默认还是去当前db认证。
- 错误写法:
db.authenticate("u", "p")→ 默认在db(比如myapp)里找用户 - 正确写法:
client.admin.authenticate("u", "p", authSource="admin")→ 明确指定认证源 - 注意:
authenticate()是Database对象的方法,但authSource参数决定它往哪个库发认证请求,所以通常用client.admin.authenticate(...)最稳妥
示例:
client = MongoClient("mongodb://localhost:27017/")
# 先连到 admin 库做认证
client.admin.authenticate("root", "123456", authSource="admin")
# 再取业务库
db = client.myapp
db.collection.count_documents({}) # 这时才真正可用
容易被忽略的兼容性坑:pymongo 4.x 之后authSource是强制项
pymongo 3.x 对authSource容忍度高,有时不写也能蒙混过关;但 4.0+ 版本严格校验,尤其在mongodb+srv://协议下,缺了authSource参数基本必报bad auth。
- 检查版本:
pip show pymongo,确认是不是 4.x - 不要依赖“以前能跑现在也能跑”——升级pymongo后第一反应就该补
authSource - Atlas用户尤其要注意:即使连接字符串里写了
?authSource=admin,mongodb+srv://协议下它无效,必须用关键字参数
真正麻烦的点在于:错误信息从不提示“你少写了authSource”,只冷冷甩一句bad auth。它假定你知道MongoDB的认证模型——而多数人第一次见这个报错时,根本不知道还有个authSource概念。











