【问题标题】:Authentication failure while trying to save to mongodb尝试保存到 mongodb 时身份验证失败
【发布时间】:2021-12-17 21:07:59
【问题描述】:

我有以下代码可以保存到本地运行的 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={}}

我在这里错过了什么?

【问题讨论】:

  • 您是否在启动服务时启用了身份验证,分别。在配置文件中设置?

标签: mongodb


【解决方案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 中进行身份验证时会出现身份验证错误@
猜你喜欢
  • 2014-05-29
  • 2014-07-05
  • 2021-06-19
  • 2021-01-18
  • 2016-09-07
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
相关资源
最近更新 更多