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

使用Beanie连接MongoDB非admin数据库时认证失败及角色问题

解决MongoDB多数据库连接及用户创建问题

一、用root用户正确连接db1

连接失败的核心原因是:root用户在admin数据库下创建,但你的连接串未指定认证库,MongoDB默认用连接串中的db1作为认证库,导致root用户认证失败。修改连接串,指定authSource=admin即可:

async def example():
    # 明确指定认证库为admin,root用户在此库下完成认证
    client = AsyncIOMotorClient("mongodb://root:<password>@localhost:27017/db1?authSource=admin")
    # 注意:client后的数据库名要和目标库一致,这里是db1而非db_name
    await init_beanie(database=client.db1, document_models=[doc1])

if __name__ == "__main__":
    asyncio.run(example())

二、正确创建db1的专属用户

你创建用户时的错误是误用了admin数据库专属的全局角色(readAnyDatabase、clusterAdmin),这些角色无法在db1库下分配。需为db1创建使用本地角色的用户:

  1. 先通过root用户登录admin库:
mongo -u root -p <password> --authenticationDatabase admin
  1. 切换到db1数据库:
use db1
  1. 创建拥有db1权限的用户,使用该库的本地角色:
db.createUser({
  user: "db1_user",
  pwd: "your_secure_password",
  roles: [
    { role: "readWrite", db: "db1" }  # 赋予db1的读写权限
    # 若需管理权限,可添加 { role: "dbAdmin", db: "db1" }
  ]
})

创建完成后,用该用户连接db1无需额外指定认证库:

async def example():
    client = AsyncIOMotorClient("mongodb://db1_user:your_secure_password@localhost:27017/db1")
    await init_beanie(database=client.db1, document_models=[doc1])

if __name__ == "__main__":
    asyncio.run(example())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 16:45:09