首页 > 解决方案 > 尝试保存到 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={}}

我在这里想念什么?

标签: mongodb

解决方案


在哪里,即您在哪个数据库中创建了用户?通常用户是在数据库中创建的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


推荐阅读