尝试保存到 mongodb 时身份验证失败
Posted
技术标签:
【中文标题】尝试保存到 mongodb 时身份验证失败【英文标题】:Authentication failure while trying to save to mongodb 【发布时间】:2020-12-24 12:39:52 【问题描述】:我有以下代码可以保存到本地运行的 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 MongoCredentialmechanism=SCRAM-SHA-1, userName='myuser', source='mydatabase', password=<hidden>, mechanismProperties=
我在这里错过了什么?
【问题讨论】:
您是否在启动服务时启用了身份验证,分别。在配置文件中设置? 【参考方案1】:在哪里,即您在哪个数据库中创建了用户?通常用户是在数据库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
中不存在。
【讨论】:
好的,所以我认为在 MongoCredential credential = MongoCredential.createCredential("myuser", "mydatabase", "mypassword".toCharArray());..第二个参数必须是我使用的管理数据库它用于创建用户。 是的,应该可以。但是,您必须在建立连接后切换数据库。通常,您不会在admin
数据库中创建任何应用程序集合。
我还没有在管理员中创建任何集合。但我做了这个改变,它仍然引发身份验证问题。
所以现在我的代码是:MongoCredential credential = MongoCredential.createCredential("myuser", "admin", "mypassword".toCharArray());但这也会引发身份验证错误。
不,用户 ID 是 test.myuser
,即它是在 test
数据库中定义的。在创建用户之前运行 use admin
或运行 db.getSiblingDB('admin').createUser(...)
您在 admin 数据库上授予 userAdminAnyDatabase,即您允许用户在 admin 数据库中创建用户。但是它在测试中创建的用户本身,因此当您尝试在 DB admin
中进行身份验证时会出现身份验证错误@以上是关于尝试保存到 mongodb 时身份验证失败的主要内容,如果未能解决你的问题,请参考以下文章
Golang 和 MongoDb 远程访问失败(服务器在 SASL 身份验证步骤返回错误:身份验证失败。)
MongoError:身份验证失败。 NestJs MongoDb 图集
使用 Spring Boot 对 mongoDB 进行身份验证失败