PyMongo连接MongoDB报错not authorized on db无权限排查
MongoDB PyMongo 报13未授权错误解决方法
你配置的数据库用户本身权限是足够的(dbOwner角色拥有所属库的全部操作权限,额外配置的readWrite属于冗余配置不影响使用),且相同连接串在Studio 3T中可正常查询,说明账号密码、网络连通性、authSource配置均无问题,报错由PyMongo驱动和服务端的兼容问题导致,按以下步骤逐一排查修复即可:
1. 修正连接串的认证机制配置
你当前连接串中强制指定了authMechanism=SCRAM-SHA-1,但你的用户同时支持SCRAM-SHA-1和SCRAM-SHA-256两种认证机制:
- PyMongo 4.x版本对MongoDB 4.0+集群默认优先协商SCRAM-SHA-256认证,强制写死SCRAM-SHA-1会出现认证握手成功但执行操作时鉴权上下文不匹配的问题,Studio 3T会自动做降级适配所以不会触发该问题。
- 先删除连接串中强制写死的authMechanism参数,让驱动自动和服务端协商认证方式,修改后连接串如下:
Connection_string= 'mongodb://user:password@cluster:111111/db?ssl=false&connectTimeoutMS=10000&authSource=db'
如果修改后仍报错,再显式指定使用SCRAM-SHA-256测试:
Connection_string= 'mongodb://user:password@cluster:111111/db?ssl=false&connectTimeoutMS=10000&authSource=db&authMechanism=SCRAM-SHA-256'
2. 修正代码中库和集合的引用方式
你当前代码中用client.db、db.collection_name的属性写法,是固定访问名为db的数据库、名为collection_name的集合,一旦实际业务库名、集合名和硬编码值不匹配,就会触发跨库访问的权限报错(你的账号仅有权限访问所属数据库)。
不要用属性硬编码,改用字典方式引用,避免写错名称,同时先做权限连通性校验:
from pymongo import MongoClient # 替换为你实际的库名、集合名 target_db = "你的业务库名" target_coll = "你要查询的集合名" client = MongoClient(Connection_string) db = client[target_db] # 先测试连通性和权限,如果能正常返回集合列表说明认证完全正常 print("当前库下可访问的集合:", db.list_collection_names()) collection = db[target_coll] cursor = collection.find({}) for r in cursor: print(r)
3. 修复PyMongo高版本和老集群的兼容问题
如果以上两步修改后仍报错,检查PyMongo版本:
- PyMongo 4.x版本默认会在所有请求中携带
lsid(会话ID)参数,就是你报错信息里看到的lsid: { id: UUID("xx") }字段,部分自建MongoDB 3.x、4.0早期版本集群无法识别该参数,会直接返回未授权错误。 - 先在初始化MongoClient时加
directConnection=True参数,关闭集群自动发现逻辑测试:
client = MongoClient(Connection_string, directConnection=True)
- 如果还是报错,直接降级PyMongo到3.x最后一个稳定版本3.12.3,该版本默认不会强制携带lsid参数,兼容绝大多数老版本集群:
pip install pymongo==3.12.3
只要执行db.list_collection_names()能正常返回集合列表,就说明认证和权限完全正常,后续的查询操作不会再触发13未授权错误。
内容的提问来源于stack exchange,提问作者jedrek
相关产品推荐
相关产品推荐

