能获取MongoDB集合信息,但调用find()查询文档时认证失败
MongoDB 5.0 + PyMongo 查询文档时认证失败的解决思路
问题还原
能通过PyMongo获取MongoDB 5.0服务器的集合列表,但调用find()查询集合文档时触发认证失败错误:
OperationFailure: 认证失败。完整错误信息: {'ok': 0.0, 'errmsg': '认证失败。', 'code': 18, 'codeName': 'AuthenticationFailed', ......}
可能的原因及解决方法
账号权限不足
即使能连接服务器并查看集合列表,也不代表账号拥有目标数据库的读写权限。登录MongoDB Shell执行以下操作:- 切换到admin数据库:
use admin - 查看账号权限:
db.getUser("你的用户名") - 如果缺少目标数据库的权限,执行授权命令:
db.grantRolesToUser("你的用户名", [{role: "readWrite", db: "mydatabase"}])
- 切换到admin数据库:
认证机制不匹配
MongoDB 5.0默认使用SCRAM-SHA-256认证机制,而你的连接字符串指定了SCRAM-SHA-1,可能导致认证失败。尝试两种修改方式:- 去掉
authMechanism参数,让PyMongo自动协商匹配的机制:import pymongo myclient = pymongo.MongoClient("mongodb+srv://username:password@hostname/?ssl=false&serverSelectionTimeoutMS=50000&connectTimeoutMS=10000&authSource=admin") mydb = myclient["mydatabase"] mycol = mydb["customers"] for x in mycol.find(): print(x) - 显式指定
SCRAM-SHA-256:import pymongo myclient = pymongo.MongoClient("mongodb+srv://username:password@hostname/?ssl=false&serverSelectionTimeoutMS=50000&connectTimeoutMS=10000&authSource=admin&authMechanism=SCRAM-SHA-256") mydb = myclient["mydatabase"] mycol = mydb["customers"] for x in mycol.find(): print(x)
- 去掉
authSource配置错误
如果你的账号是在mydatabase而非admin数据库下创建的,需要将authSource修改为目标数据库名称:myclient = pymongo.MongoClient("mongodb+srv://username:password@hostname/?ssl=false&serverSelectionTimeoutMS=50000&connectTimeoutMS=10000&authSource=mydatabase&authMechanism=SCRAM-SHA-256")账号密码存在URL特殊字符
如果用户名或密码包含@、:、/等特殊字符,需要进行URL编码后再填入连接字符串。比如密码是pass@123,要转成pass%40123。
内容的提问来源于stack exchange,提问作者Jessie
相关产品推荐
相关产品推荐

