You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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会触发字段合法性校验错误。

解决步骤:

  1. 创建新的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}])
    
  2. 确保执行操作的账号拥有足够权限:需具备userAdmin或userAdminAnyDatabase角色,才能创建数据库用户。

内容的提问来源于stack exchange,提问作者Roy Tommy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 20:12:54