mongodb - 尝试保存到 mongodb 时身份验证失败
问题描述
我有以下代码保存到本地运行的 mongo 实例:
MongoCredential credential = MongoCredential.createCredential("myuser", "mydatabase", "mypassword".toCharArray());
MongoClient mongo = MongoClients.create(MongoClientSettings.builder()
.applyToClusterSettings(builder -> builder.hosts(Arrays.asList(new
ServerAddress("localhost", 27017))))
.credential(credential)
.build());
MongoDatabase database = mongo.getDatabase("mydatabase");
MongoCollection<Document> collection = database.getCollection("mycollection");
collection.insertOne(document);
我已经使用 mongo.exe shell 中的 db.createUser() 命令为上面代码中使用的用户名/密码创建了一个用户,这些是我在安装 mongodb 时提供的相同凭据。
db.createUser(
{ user: "myuser",
pwd: "mypassword",
roles:[{role: "userAdminAnyDatabase" , db:"admin"}]})
但是代码失败了:
Exception in thread "main" com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=SCRAM-SHA-1, userName='myuser', source='mydatabase', password=<hidden>, mechanismProperties={}}
我在这里想念什么?
解决方案
在哪里,即您在哪个数据库中创建了用户?通常用户是在数据库中创建的admin
。当您连接到 MongoDB 时,您应该始终指定身份验证数据库和您喜欢使用的数据库。
默认值有点混乱,并且不是真正一致的,请参阅此表以获取概述:
+----------------------------------------------------------------------------------------+
|Connection string | Authentication | Current |
| | database | database |
+----------------------------------------------------------------------------------------+
|mongo -u <...> -p <...> --authenticationDatabase admin myDB | admin | myDB |
|mongo -u <...> -p <...> myDB | myDB | myDB |
|mongo -u <...> -p <...> --authenticationDatabase admin | admin | test |
|mongo -u <...> -p <...> localhost:27017 | test | test |
|mongo -u <...> -p <...> --host localhost:27017 | admin | test |
|mongo -u <...> -p <...> | admin | test |
+----------------------------------------------------------------------------------------+
如果你喜欢使用 URI 格式的连接字符串,它会对应于这些:
mongodb://<username>:<password>@hostname/myDB?authSource=admin
mongodb://<username>:<password>@hostname/myDB
mongodb://<username>:<password>@hostname?authSource=admin
mongodb://<username>:<password>@hostname
我猜您在admin
数据库中创建了用户,但是由于您在连接时没有指定 authenticationDatabase ,因此 Mongo 默认将其设置为mydatabase
失败的位置,因为用户在数据库中不存在mydatabase
。
推荐阅读
- python - 如何在python中转义命令行的参数?
- curl - 示例 Spotify api 音频分析 CURL 命令有效,但是当我输入新歌曲 ID 时它不起作用 - 正确的命令是什么?
- jupyter-notebook - 如何使用 nbconvert 访问 jupyter 标签
- android - 是否可以在没有额外变量的情况下增加 mutablelivedata?
- c# - 使用modbus进行异步设备通信的问题
- vim - 自定义语法高亮无法通过 ~/.vimrc
- android - Kotlin、Coroutines、Kodein 和 RecyclerView 列表
- c - 将包含浮点数的结构转换为对网络更友好的结构
- javascript - 复制 dataLayer 正在返回 {object Object}
- substrate - 基板中的事件存储成本是多少?