尝试保存到 mongodb 时身份验证失败

Man*_*oid 6 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);
Run Code Online (Sandbox Code Playgroud)

我在 mongo.exe shell 中使用 db.createUser() 命令为上面代码中使用的 usernmae/password 创建了一个用户,这些与我在安装 mongodb 时提供的凭据相同。

db.createUser(
{   user: "myuser",
    pwd: "mypassword",

    roles:[{role: "userAdminAnyDatabase" , db:"admin"}]})
Run Code Online (Sandbox Code Playgroud)

但代码失败并显示:

Exception in thread "main" com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=SCRAM-SHA-1, userName='myuser', source='mydatabase', password=<hidden>, mechanismProperties={}}
Run Code Online (Sandbox Code Playgroud)

我在这里缺少什么?

Wer*_*eit 13

您在哪里(即在哪个数据库中)创建了用户?通常,用户是在数据库中创建的admin。当您连接到 MongoDB 时,您应该始终指定身份验证数据库和您喜欢使用的数据库。

默认值有点令人困惑,而且不太一致,尤其是。不同的驱动程序/工具似乎表现不同。请参阅此表以获取概述:

+-------------------------------------------------------------------------------------+
|Connection parameters                                    | Authentication | Current  |
|                                                         | database       | database |
+-------------------------------------------------------------------------------------+
|mongo -u user -p pwd --authenticationDatabase admin myDB |     admin      |   myDB   |
|mongo -u user -p pwd myDB                                |     myDB       |   myDB   |
|mongo -u user -p pwd --authenticationDatabase admin      |     admin      |   test   |
|mongo -u user -p pwd --host localhost:27017              |     admin      |   test   |
|mongo -u user -p pwd                                     |     admin      |   test   |
|mongo -u user -p pwd localhost:27017                     |     test       |   test   | 
|mongosh -u user -p pwd localhost:27017                   |     admin      |   test   | -> Different on mongosh and legacy mongo shell
+-------------------------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

如果您喜欢使用 URI 格式的连接字符串,那么它将对应于这些。在那里它更加一致并且有据可查

+-------------------------------------------------------------------------------------+
|Connection string                                        | Authentication | Current  |
|                                                         | database       | database |
+-------------------------------------------------------------------------------------+
|"mongodb://user:pwd@hostname/myDB?authSource=admin"      |     admin      |   myDB   |
|"mongodb://user:pwd@hostname/myDB"                       |     myDB       |   myDB   |
|"mongodb://user:pwd@hostname?authSource=admin"           |     admin      |   test   |
|"mongodb://user:pwd@hostname"                            |     admin      |   test   |
+-------------------------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

我猜您在数据库中创建了用户admin,但由于您在连接时没有指定authenticationDatabase,Mongo默认将其设置为mydatabase失败的位置,因为数据库中不存在用户mydatabase