使用PyMongo 4创建MongoDB用户时遇credentials字段错误求助
问题:PyMongo 4创建MongoDB用户时出现"credentials字段需为非空对象"错误
问题背景
由于PyMongo 4的add_user API已废弃,改用在admin数据库执行createUser命令创建用户:
db.command("createUser", username, pwd=password, roles=[{"role":"readWrite", "db": customer_database_name}])
该命令在本地Mongo实例和IPython中运行正常,但生产环境执行时报错。
错误信息
pymongo.errors.OperationFailure: User document needs 'credentials' field to be a non-empty object, full error: {'ok': 0.0, 'errmsg': "User document needs 'credentials' field to be a non-empty object", 'code': 2, 'codeName': 'BadValue'}
生产环境db对象信息
Database(MongoClient(host=['192.168.1.45:27017'], document_class=dict, tz_aware=False, connect=True, authsource='$external', authmechanism='MONGODB-AWS', authmechanismproperties={'AWS_SESSION_TOKEN': 'FwoGZXIvYXdzEEcaDAhhtbMogjl358f1AiKYAc/qgGiNBxqvNu+jxt/zQ56xP0K7se2hL20tv2NwiLGpOeDIxIDoGWOcayQ8pszaoiPzTsqtQuzuFr07MOQ6DWVtbAqk3I38rATSSRKUqgCUFbs1bX3OwVVu04f79YAiuRc2PRtaqr/CLPFBgsLGF9U6bk6xFuAGwfMLEJTpl630mizPsrl9ocbc8PdbVscNuBuEzeNPeRjfKIG2g6gGMh81euxVQfDpmKSm6ziH8I01mc2e3c+0AL/IiuLjx57v'}, tls=True, tlsallowinvalidcertificates=True, appname='<appname>', tlsdisableocspendpointcheck=True), 'admin')
排查与解决方案
你的怀疑正确,问题根源在于当前MongoClient使用了外部认证源(authsource='$external')和MONGODB-AWS认证机制:
- $external是用于外部身份验证(如IAM角色)的集合,仅存储外部身份信息,不支持存储密码型用户的credentials字段。当你尝试在该认证源下创建带密码的用户时,MongoDB会触发字段合法性校验错误。
解决步骤:
- 创建新的MongoClient实例,明确指定authsource为admin,使用具备用户管理权限的内置账号(而非AWS认证)登录:
from pymongo import MongoClient client = MongoClient( host="192.168.1.45:27017", username="admin_user", password="admin_pwd", authsource="admin", authmechanism="SCRAM-SHA-256", tls=True, tlsallowinvalidcertificates=True, tlsdisableocspendpointcheck=True ) admin_db = client["admin"] admin_db.command("createUser", username, pwd=password, roles=[{"role":"readWrite", "db": customer_database_name}]) - 确保执行操作的账号拥有足够权限:需具备
userAdmin或userAdminAnyDatabase角色,才能创建数据库用户。
内容的提问来源于stack exchange,提问作者Roy Tommy
相关产品推荐
相关产品推荐

