使用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创建使用本地角色的用户:
- 先通过root用户登录
admin库:
mongo -u root -p <password> --authenticationDatabase admin
- 切换到
db1数据库:
use db1
- 创建拥有
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
相关产品推荐
相关产品推荐

