尝试保存到 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 图集

mLab 上的 MongoDB 身份验证失败

使用 Spring Boot 对 mongoDB 进行身份验证失败

Laravel 身份验证 hasValidCredentials 失败

MongoDB 客户端访问控制:SCRAM-SHA-1 身份验证失败,storedKey 不匹配