Seguridad por Filas en PostgreSQL 9.5 (Row Level Security)

Si como ven el título se puede lograr el Row Level Security (RLS) desde PostgreSQL 9.5, fascinante esta funcionalidad, quedaron atrás los trucos con las vistas para lograr el RLS en PostgreSQL, para ver la documentación puede visitar aquí

 

La sitanxis básica es:

CREATE POLICY name ON table_name [ FOR { ALL | SELECT | INSERT | UPDATE | DELETE } ] [ TO { <trole_name | PUBLIC | CURRENT_USER | SESSION_USER } [, ...] ] [ USING ( using_expression> ) ] [ WITH CHECK ( check_expression ) ]

Veamos un ejemplo de su uso:

Lo primero es seleccionar una expresión para para la política de acceso, en este caso vamos a utilizar un campo llamado “usuario” en la tabla “tabla”


CREATE TABLE tabla (valor int,usuario text);


CREATE ROLE pepe login password 'pepe';

INSERT INTO tabla VALUES (1,'postgres');

INSERT INTO tabla VALUES (2,'pepe');

--lo nuevo

CREATE POLICY por_user ON tabla for all to public USING (usuario= current_user);

--asegurarse de habilitar el RLS en la tabla
ALTER TABLE tabla ENABLE ROW LEVEL SECURITY;

set session authorization pepe;
SELECT * FROM tabla ;
 valor | usuario
-------+---------
 2 | pepe

(1 filas)

 

También puede hacerse algo un poco más complejo, todo depende del criterio para la política, por ejemplo pudiéramos utilizar la siguiente:

— es para el usuario pepe y el solo tendrá full acceso a las filas donde el valor sea par


CREATE POLICY por_par ON tabla2 for all to pepe USING (valor%2= 0);
\d tabla2
Tabla «public.tabla2»
 Columna | Tipo | Modificadores
---------+---------+---------------
 i | integer |
Policies:
 POLICY "por_par" FOR ALL
 TO pepe
 USING ((i % 2) = 0)

INSERT INTO tabla2 VALUES (1),(2);

SET SESSION authorization pepe;

INSERT INTO tabla2 VALUES(4);
INSERT 0 1
INSERT INTO tabla2 VALUES(3);
ERROR: new row violates row level security policy for "tabla2"

 

Esto viene a resolver un tema grande de acceso a los datos y es una evidencia más de la evolución de PostgreSQL

 

Nos vemos en otra 😀

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s