3

Creando usuarios y asignar roles en MongoDB

Eduardo
eperedo
52725

Así como con las bases de datos SQL en MongoDB también puedes crear usuarios y asignarles acceso mediante roles, en este tutorial te voy a enseñar como crear un usuario y asignarle un rol para que tenga ciertos accesos limitados a una base de datos.

⚠️ Para seguir este tutorial se asume que tienes una instalación de MongoDB con la autenticación activada.

Vamos a imaginar que tenemos el siguiente escenario: Eres el administrador de base de datos de una empresa y te piden generar dos usuarios para una base de datos:

  • El primer usuario deberá llamarse lector y solo tendrá acceso de lectura a la base de datos
  • El segundo usuario tendrá como nombre escritor y tendrá acceso de lectura y escritura a la base de datos.

Asumiendo que ya tenemos instalado MongoDB lo primero será crear la base de datos. Una vez en el shell de mongo creamos la base de datos:

use blog

Ahora insertamos un par de documentos en la colleción posts

db.posts.insertOne({ title: "Articulo 1" });
db.posts.insertOne({ title: "Articulo 2" });

📖 Creando un usuario de solo lectura

Ahora vamos a cumplir nuestra primera tarea de crear un usuario que solo pueda leer los posts, pero bajo ningún motivo pueda crear nuevos artículos.
Para lograr esto vamos a usar el método createUser. Este método acepta como parámetro un objeto con las siguientes propiedades:

  • user: Esta propiedad representa el nombre del usuario, en nuestro caso le asignaremos lector
  • pwd: Acá asignaremos la contraseña para el usuario.
  • roles: Un arreglo de objetos. Acepta un arreglo para el caso que tu usuario vaya a tener acceso a múltiples bases de datos.

El código quedaría de la siguiente manera:

db.createUser(
  {
    user: "lector",
    pwd: "123456",
    roles: [
       { role: "read", db: "blog" }
    ]
  }
)

Mongo viene con roles predefinidos, uno de ellos es el role read que como ya te debes imaginar solo permite ejecutar métodos de solo lectura.
La propiedad db es donde vas a indicar a qué base de datos se le asignará dicho rol.

✍️ Creando un usuario de escritura y lectura

Ahora vamos con el segundo usuario, el proceso sería el mismo, pero en este caso el role ya no será read sino readWrite. Con este rol el usuario tendrá acceso a los métodos de lectura y escritura de la base de datos.

db.createUser(
  {
    user: "escritor",
    pwd: "123456",
    roles: [
       { role: "readWrite", db: "blog" }
    ]
  }
)

Listo, ya tenemos nuestro dos usuarios. Vamos a hacer algunas pruebas para verificar que realmente cada usuario cuenta con los accesos correctos.

Para poder ingresar al shell de mongo con el usuario usaremos los parámetros -u y -p. En la terminal escribe lo siguiente

mongo -u lector -p123456

Primero verificamos si puedo leer los posts

useblog;
db.posts.find();

Obtengo la respuesta correctamente mostrando los dos documentos insertados anteriormente

{ "_id" : ObjectId("5e438449ea91620ed74d3cf3"), "title" : "Articulo 1" }
{ "_id" : ObjectId("5e43844cea91620ed74d3cf4"), "title" : "Articulo 2" }

Ahora intentaremos insertar un nuevo documento

db.posts.insertOne({ title: "Articulo 3" });

Debería lanzarnos un error parecido al siguiente:

{
  "errmsg" : "not authorized on blog to execute command" # mensaje cortado por temas de espacio
  "codeName" : "Unauthorized"
}

Listo, ahora hagamos el mismo proceso para el usuario escritor, primero debemos salir del shell y volver a loguearnos:

mongo -u escritor -p123456 --authenticationDatabase blog

Leemos los posts usando el método find:

 db.posts.find();
# { "_id" : ObjectId("5e438449ea91620ed74d3cf3"), "title" : "Articulo 1" }# { "_id" : ObjectId("5e43844cea91620ed74d3cf4"), "title" : "Articulo 2" }

Funciona bien el permiso de lectura, ahora intentaremos insertar el Artículo #3:

db.posts.insertOne({ title: "Articulo 3" });

Nos devuelve información del nuevo documento registrado

{
  "acknowledged" : true,
  "insertedId" : ObjectId("5e4385e6e2306e7554d9e60f")
}

✅ Conclusiones

  • Para crear usuarios en MongoDB debes verificar que tienes activado el modo de authenticación
  • Crear usuarios con roles predefinidos es bastante simple usando el método db.createUser
  • Puedes asignarles varios roles a un mismo usuario y darle acceso a distintas bases de datos
  • Para otros casos de uso revisa la documentación en las secciones de Authentication y Roles
Escribe tu comentario
+ 2