尝试保存到mongodb时认证失败

时间:2020-09-05 14:02:16

标签: 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()命令为上面代码中使用的usernmae /密码创建了一个用户,这些与我在安装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={}}

我在这里想念什么?

1 个答案:

答案 0 :(得分:1)

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

默认值有点令人困惑,请参阅下表以获得概述:

+---------------------------------------------------------------------------------------------+
|Connection string                                           | Authentication DB | Current DB |
+---------------------------------------------------------------------------------------------+
|mongo -u <...> -p <...> --authenticationDatabase admin myDB |       admin       |    myDB    |
|mongo -u <...> -p <...> myDB                                |       myDB        |    myDB    |
|mongo -u <...> -p <...> --authenticationDatabase admin      |       admin       |    test    |
|mongo -u <...> -p <...>                                     |       admin       |    test    |
+---------------------------------------------------------------------------------------------+

如果您想使用URI格式的Connection字符串,它将与以下内容相对应:

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,因为用户不存在于数据库{{1 }}。