使用PyMongo(v4)和MongoDB(v6)创建指定库读写用户遇问题求助
问题排查与解决方法
1. 确认用户创建的目标数据库是否正确
MongoDB的用户绑定到创建时所在的数据库(即用户认证库),如果管理员账号在admin库认证,执行createUser前必须先切换到testdb:
use testdb db.createUser({ user: "testuser", pwd: "yourpassword", roles: [{ role: "readWrite", db: "testdb" }] })
如果直接在admin库执行上述命令,用户会被创建在admin库,此时查询testdb.getUsers()自然为空,登录时需要指定authSource=admin才能认证,但权限仅针对testdb生效。
2. 登录时必须指定正确的认证数据库
用新用户连接时,必须明确指定用户创建时所在的数据库作为认证源:
- 命令行方式:
mongo "mongodb+srv://<cluster-url>/testdb" --username testuser --password yourpassword --authenticationDatabase testdb - PyMongo连接示例:
from pymongo import MongoClient client = MongoClient( "mongodb+srv://<cluster-url>/", username="testuser", password="yourpassword", authSource="testdb" )
省略authSource时,MongoDB会默认用连接的数据库作为认证源,若用户实际创建在admin库,就会触发认证失败。
3. 检查Digital Ocean托管MongoDB的特殊限制
Digital Ocean的托管MongoDB集群可能存在以下限制:
- 用户创建后需等待1-2分钟同步到所有节点,刚创建就登录可能出现认证失败
- 部分集群要求通过DO控制面板创建用户,而非直接执行
createUser命令(即便返回ok:1,实际可能未生效) - 确认管理员账号拥有
userAdminAnyDatabase或userAdmin角色,否则createUser可能表面成功但实际未写入
4. 正确查询用户列表
- 查询当前数据库的用户:
db.getUsers() - 查询所有数据库的用户(需管理员权限,在
admin库执行):use admin db.system.users.find({ "db": "testdb" })
若用户创建在admin库,testdb.getUsers()会返回空,需在admin库查询。
5. 验证角色权限是否正确
确认createUser中的roles配置无误,必须明确指定db: "testdb":
roles: [{ role: "readWrite", db: "testdb" }]
如果写成roles: ["readWrite"],权限会作用在创建用户的数据库(如admin),而非testdb,导致用户无法操作目标库。
内容的提问来源于stack exchange,提问作者Nigini
相关产品推荐
相关产品推荐

