CodeGym /Cursos /SQL SELF /Creación y gestión de roles: ROLES

Creación y gestión de roles: ROLES

SQL SELF
Nivel 47, Lección 1
Disponible

Un rol en PostgreSQL puede representar tanto a un usuario individual como a un grupo de usuarios. Controla el acceso a bases de datos, tablas, esquemas y otros objetos.

Cuando creas un rol, por defecto no está vinculado a un usuario o grupo concreto, pero puedes asignarle propiedades y permisos según lo que necesites.

Diferencia entre roles y usuarios

¿Y los usuarios? Aquí es importante no confundirse. En PostgreSQL los usuarios también se consideran roles, pero con una particularidad: los usuarios siempre pueden iniciar sesión. O sea, cualquier rol puede ser usuario si tiene el atributo LOGIN. Si solo quieres que el rol agrupe usuarios o no tenga acceso de inicio de sesión, simplemente no le pongas el atributo LOGIN.

Ejemplo:

  • Rol con el atributo LOGIN = usuario.
  • Rol sin LOGIN = grupo o "rol de servicio".

Creando un rol

Para crear roles se usa el comando CREATE ROLE. La sintaxis es así:

CREATE ROLE <nombre_del_rol> [WITH] [parámetros];

Donde parámetros son las propiedades del rol, como:

  • LOGIN — posibilidad de iniciar sesión en la base de datos.
  • CREATEDB — posibilidad de crear bases de datos.
  • CREATEROLE — posibilidad de crear otros roles.
  • SUPERUSER — acceso total (los roles más peligrosos, úsalos con cuidado).
  • PASSWORD — contraseña para autenticación.

Vamos a ver un ejemplo de cómo crear un rol de usuario. Supón que quieres crear el usuario student con permiso para iniciar sesión y una contraseña. Para eso ejecuta la siguiente consulta:

CREATE ROLE student WITH LOGIN PASSWORD 'securePassword123';

Este comando creará un rol llamado student que podrá conectarse a la base de datos.

Ahora vamos a crear el rol teachers, que será un grupo. Un rol de grupo no necesita el atributo LOGIN, ya que los usuarios que estén en el grupo usarán sus propias cuentas.

CREATE ROLE teachers;

Asignando privilegios a los roles

Los roles en PostgreSQL se crean para dar o limitar acceso a los recursos. Para esto se usan los comandos GRANT y REVOKE.

Dar permisos con GRANT

La sintaxis del comando:

GRANT <privilegios> ON <objeto> TO <rol>;

Vamos a crear una tabla courses y darle al rol teachers permisos para leer y modificar datos en esa tabla.

-- Creamos la tabla
CREATE TABLE courses (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    teacher_id INT
);

-- Damos acceso
GRANT SELECT, INSERT, UPDATE ON courses TO teachers;

Ahora todos los usuarios que estén en el rol teachers podrán ver, añadir y modificar datos en la tabla.

Revocar permisos con REVOKE

Para quitar permisos se usa el comando REVOKE. Sintaxis:

REVOKE <privilegios> ON <objeto> FROM <rol>;

Si quieres prohibir que el grupo teachers actualice datos en la tabla courses, ejecuta este comando:

REVOKE UPDATE ON courses FROM teachers;

Jerarquía de roles: herencia

Los usuarios pueden "heredar" privilegios de un rol-grupo para facilitar la gestión. Es como pasar una "herencia" de un usuario a otro.

La palabra clave INHERIT permite que un rol herede privilegios de otro rol. Este comportamiento viene activado por defecto, pero puedes cambiarlo.

Ejemplo:

-- Añadimos el usuario `john` al grupo `teachers`
GRANT teachers TO john;

Ahora el usuario john recibirá automáticamente todos los privilegios asignados al rol de grupo teachers.

Vamos a comprobar los privilegios:

\du john

Si quieres desactivar la herencia, crea el rol con el atributo NOINHERIT.

CREATE ROLE admin NOINHERIT;

Ahora los usuarios en el rol admin no podrán usar sus privilegios por defecto.

Creando grupos de roles para gestionar el acceso

Los grupos de roles facilitan la gestión de permisos, sobre todo en proyectos grandes. En vez de dar permisos a cada usuario, puedes añadir usuarios a grupos y dar los permisos necesarios a los grupos.

Vamos con un ejemplo sencillo de rol de grupo. Para esto creamos los grupos:

  • students — grupo para estudiantes.
  • teachers — grupo para profes.
CREATE ROLE students;
CREATE ROLE teachers;

Asignamos usuarios a los grupos:

-- Añadir el usuario john al grupo students
GRANT students TO john;

-- Añadir el usuario jane al grupo teachers
GRANT teachers TO jane;

Ahora, si das acceso a las tablas a los grupos students y teachers, ¡automáticamente lo tendrán todos sus miembros!

Ejercicio práctico

  1. Crea una tabla exams con los campos:
    • id: clave primaria;
    • subject: texto;
    • teacher_id: ID del profe.
CREATE TABLE exams (
    id SERIAL PRIMARY KEY,
    subject TEXT NOT NULL,
    teacher_id INT
);
  1. Crea los grupos de roles students y teachers.
CREATE ROLE students;
CREATE ROLE teachers;
  1. Da al grupo teachers permisos para añadir y modificar datos en la tabla exams.
GRANT INSERT, UPDATE ON exams TO teachers;
  1. Da al grupo students permisos solo para leer datos.
GRANT SELECT ON exams TO students;
  1. Crea el usuario alice y añádela al grupo students.
CREATE ROLE alice WITH LOGIN PASSWORD 'alicePassword';
GRANT students TO alice;
  1. Comprueba qué permisos tiene alice conectándote con su cuenta.

Ahora ya sabes cómo crear roles, gestionar sus privilegios y simplificar la administración usando roles de grupo. En la próxima lección veremos cómo configurar el acceso usando los comandos GRANT y REVOKE para un control más preciso a nivel de bases de datos, esquemas y tablas.

2
Tarea
SQL SELF, nivel 47, lección 1
Bloqueada
Creación de un rol de grupo y asignación de usuarios
Creación de un rol de grupo y asignación de usuarios
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION