Error de autenticación al intentar guardar en mongodb

Resuelto Mandroid asked hace 4 años • 1 respuestas

Tengo el siguiente código para guardar en una instancia de mongo en ejecución local:

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);

Creé un usuario para el nombre de usuario/contraseña usado en el código anterior usando el comando db.createUser() en el shell mongo.exe y estas son las mismas credenciales que proporcioné al instalar mongodb.

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

    roles:[{role: "userAdminAnyDatabase" , db:"admin"}]})

Pero el código falla con:

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

¿Que me estoy perdiendo aqui?

Mandroid avatar Sep 05 '20 21:09 Mandroid
Aceptado

¿Dónde, es decir, en qué base de datos creaste el usuario? Normalmente los usuarios se crean en la base de datos admin. Cuando se conecta a MongoDB, siempre debe especificar la base de datos de autenticación y la base de datos que desea utilizar.

Los valores predeterminados son un poco confusos y no son realmente consistentes, especialmente. Diferentes controladores/herramientas parecen comportarse de manera diferente. Consulte esta tabla para obtener una descripción general:

+-------------------------------------------------------------------------------------+
|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
+-------------------------------------------------------------------------------------+

Si desea utilizar la cadena de conexión en formato URI, correspondería a estas. Allí es más consistente y está mejor documentado .

+-------------------------------------------------------------------------------------+
|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   |
+-------------------------------------------------------------------------------------+

Supongo que creó el usuario en adminla base de datos, pero como no especifica la base de datos de autenticación mientras se conecta, Mongo lo establece de manera predeterminada mydatabasedonde falla, porque el usuario no existe en la base de datos mydatabase.

Wernfried Domscheit avatar Sep 05 '2020 15:09 Wernfried Domscheit