La puesta en marcha de un proyecto que incorpore un Sistema Gestor de Base de Datos tiene un amplio abanico de posibilidades. Entre estas capacidades se encuentran las labores de creación de usuarios, definición de permisos de acceso y gestión de privilegios. En esta entrada vamos a hacer una breve referencia a cómo desplegar un sistema básico de privilegios sobre una base de datos geográfica PostgreSQL/PostGIS.
Gracias a la creación de roles de usuario y grupo se establecerán diferentes permisos sobre los objetos geográficos de nuestra base de datos. Estos permisos quedarán reflejados por ejemplo en el acceso a las tablas en QGIS.
Roles, usuarios y grupos en PostgreSQL
Los permisos de acceso en PostgreSQL se administran definiendo roles. Dentro de este concepto se incluyen tanto los usuarios como los grupos. La diferencia principal entre ambos es que, mientras el rol de tipo usuario se usa para acceder y trabajar con la base de datos, los grupos agregan a usuarios y definen permisos sobre esquemas y objetos de la estructura.
Es fundamental indicar que el nombre de usuario en la base de datos es independiente al nombre del usuario en el sistema de datos. Por ejemplo, al instalar PostgreSQL se crea por defecto el rol usuario postgres con un perfil de superusuario o administrador. Pero sin embargo, no contamos con un usuario que esté identificado con el de nuestro sistema operativo.
Crear un rol usuario
Para crear un nuevo rol de tipo usuario podemos usar tanto CREATE ROLE como CREATE USER. La diferencia entre ambos es que si usamos la opción de USER añadimos automáticamente el atributo LOGIN. Este atributo es el que nos va a servir para indicar si es un rol usuario o un rol de grupo.
Los roles pueden contener atributos (LOGIN, SUPERUSER, CREATEDB, CREATEROL…) que van a definir sus privilegios.
En las siguientes líneas se ve cómo crear un nuevo usuario que usaremos a lo largo del ejemplo.
CREATE ROLE demouser WITH
ENCRYPTED PASSWORD '123456'
LOGIN
VALID UNTIL 'INFINITY';
Privilegios mediante grupos
Vamos a situarnos en un entorno de trabajo que explota un Sistema de Información Geográfico corporativo. Para gestionar la base de datos debemos asignar los privilegios que realizaría cada uno de los trabajadores dentro de la organización. Para ello podemos hacernos una serie de preguntas sencillas.
- ¿El usuario participa de la administración de la base de datos?
- ¿El usuario necesita editar o crear datos?
- ¿El usuario sólo debe consultar los datos?
Supongamos que solo necesitamos que nuestros usuarios visualicen y consulten capas geográficas de nuestra base de datos PostGIS/PostGIS denominada ‘geodb’.

Los privilegios formarían parte de un grupo que llamaremos «grupo_consulta».
CREATE ROLE grupo_consulta
NOSUPERUSER
NOCREATEDB
NOCREATEROLE
NOINHERIT;
La inclusión de un usuario a un grupo se realiza mediante la palabra reservada GRANT.
GRANT grupo_consulta TO demouser;
Con REVOKE sacaríamos al usuario del grupo.
Permisos a tablas geográficas PostGIS
Para contar con una capa geográfica de ejemplo, hemos cargado la delimitación de los países del mundo a partir de una importación de shaperfile a PostGIS en la base de datos geodb obtenida en del repositorio de Natural Earth.

Si creamos una conexión PostGIS desde QGIS usando las credenciales de de usuario ‘demouser’, a pesar de existir una tabla geográfica no nos aparece en el árbol de capas.
Debemos por tanto definir los permisos a los objetos de la base de datos geográfica asignándose al grupo de consulta.
En primer lugar, otorgamos el privilegio USAGE al esquema al grupo de inicio de sesión. Será necesario indicar el tipo de privilegio sobre las tablas. Ya que solo queremos consultar indicamos solo SELECT.
GRANT USAGE ON SCHEMA public TO grupo_consulta;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO grupo_consulta;
Como particularidad de trabajo con bases de datos geográficas, debemos también dar privilegios de tipo SELECT en las tablas public.geometry_columns y public.spatial_ref_sys.
GRANT SELECT ON public.geometry_columns TO grupo_consulta;
GRANT SELECT ON public.spatial_ref_sys TO grupo_consulta;
Tras estas modificaciones, ya podremos acceder y cargar nuestra capa de países en QGIS.
Como detalle final hay que indicar que debido a los privilegios de grupo la capa no permitirá su edición. El botón de conmutar edición de QGIS se encuentra bloqueado al igual que todas las opciones del menú Editar.

Será cuestión de crear por tanto un nuevo grupo que incluya los correspondientes permisos para que las capas pudieran ser editadas.
Muy buenos días Patricio y muchas gracias por tan clara explicación. Me ha quedado una pequeña duda respecto al uso de más esquemas de trabajo dentro de la base de datos espacial. ¿Sería necesario correr las sentencias de GRANT y SELECT para cada uno de los esquemas? Entiendo que las tablas geometry_columns y public.spatial_ref_sys son exclusivas para el esquema public, pero de todas maneras me gustaría clarificar sobre esta cuestión, al menos en el GRANT.
Desde ya agradezco mucho tu respuesta.
Saludos Mauro. Gracias por tus comentarios.
Efectivamente si cuentas datos en otros esquemas diferentes a public debes añadirlos cuando gestionas sus permisos.