Clase 05 · Seguridad

Que cada usuario vea solo lo suyo: RLS y validación

conceptual
01

Por qué medio mundo usa Supabase

Supabase te da el backend entero hecho: la base de datos, el inicio de sesión y la puerta para que tu app hable con la base. Arrancas rápido, sin montar un servidor. Por eso lo usa tanta gente.

02

Y ahí mismo nace su mayor riesgo

Esa comodidad expone tu base hacia afuera, hasta el navegador. Y el guardia viene apagado de fábrica. Si no lo enciendes, cualquiera con la llave pública pide datos de otros clientes. Por eso es lo primero que cierras.

03

Cada usuario ve solo lo suyo

El fallo más caro en un SaaS: que un cliente vea datos de otro. Vamos a evitarlo.

04

RLS: cada quien ve lo suyo

La base de datos misma rechaza acceso ajeno. En Supabase está apagado por defecto. Lo enciendes en cada tabla. Sin RLS, todo queda abierto.

CADA USUARIO SOLO VE SUS FILAS AUSUARIO Apide sus datosdame mis datosBASE DE DATOSRLS ONAfila del usuario ABfila del usuario BAotra fila de ACfila del usuario CBotra fila de Bfiltra por dueñoLO QUE VE AAfila del usuario AAotra fila de Afila de B · bloqueadafila de C · bloqueadafila de B · bloqueadasolo sus dos filas lo impide la base de datos, no el código En Supabase viene apagado por defecto. Hay que encenderlo en cada tabla.
La regla vive en la base de datos. Aunque la app falle, las filas de los demás siguen cerradas.
05

El caso de Ana y Beto

Una tabla facturas. Sin RLS, si Beto la pide, la base le entrega todo, hasta las de Ana. Con RLS, la base solo le da las suyas. Aunque el código tenga un bug.

UNA TABLA · DOS DUEÑOS · ANA Y BETO SIN RLSBBeto pideselect * from facturasla consulta pide de másbugfacturasRLS OFFAFactura #A-018de Anase filtraBFactura #B-204de BetoentregadaAFactura #A-019de Anase filtraBFactura #B-205de BetoentregadaBeto termina viendo las de AnavsCON RLSBBeto pideselect * from facturasla misma consulta, el mismo bugbugfacturasRLS ONAFactura #A-018de AnabloqueadaBFactura #B-204de Betopara BetoAFactura #A-019de AnabloqueadaBFactura #B-205de Betopara BetoBeto solo ve las suyas El bug es el mismo. Lo que cambia es la base.
Misma consulta en las dos. Con RLS, la base filtra por user_id y las filas de Ana quedan cerradas.
06

El SQL que lo enciende

Dos líneas. La primera prende el guardia en la tabla. La segunda pone la regla: cada quien ve solo las filas con su user_id. auth.uid() lo pone la base, no el cliente.

# 1) Enciende el guardia en la tablaalter table facturas enable row level security;# 2) Regla: cada quien ve solo SUS facturascreate policy "cada quien ve sus facturas"on facturasfor selectusing ( (select auth.uid()) = user_id );
07

El interruptor del panel

Cada tabla trae un botón Enable RLS. La trampa: si la creas por SQL, nace apagada hasta que la enciendes. Una tabla nueva sin guardia es una tabla abierta.

08

Las llaves caras no van al navegador

NEXT_PUBLIC_ va al navegador. Las llaves de OpenAI, Claude, servicio role: se quedan en el servidor. El prefijo te dice qué es seguro exponer.

DÓNDE VIVE CADA LLAVE NAVEGADORel lado público, lo que todos venNEXT_PUBLIC_SUPABASE_ANON_KEY la anon key de Supabase. Hecha para mostrarse.segura de mostrar AQUÍ TERMINA LO PÚBLICO solo lo marcado NEXT_PUBLIC_ sube sin prefijo, no cruzan SERVIDORel lado escondido, nadie lo ve desde fueraOPENAI_API_KEYcara · se queda aquíANTHROPIC_API_KEYcara · se queda aquíSUPABASE_SERVICE_ROLE_KEYcara · se queda aquí
El prefijo NEXT_PUBLIC_ es el permiso para salir. Sin él, la llave se queda en el servidor.
09

Dos llaves: anon y service_role

La anon (prefijo NEXT_PUBLIC_) va al navegador y respeta RLS. La service_role se salta RLS entera. Esa jamás toca el navegador. Vive solo en el servidor.

DOS LLAVES DE SUPABASE NAVEGADORel lado público · cualquiera puede mirarsí entrajamás cruzaanon keyla llave públicaNEXT_PUBLIC_SUPABASE_ANON_KEY Va al navegadorRespeta RLS · ves solo lo tuyoSegura de exponerLa llave del edificioAbre las zonas comunes.Respeta cada apartamento.service_role keyla llave maestra SUPABASE_SERVICE_ROLE_KEY Jamás toca el navegadorSe salta RLS · lo ve TODOSolo vive en el servidorLa llave maestra del conserjeAbre cada puerta del edificio.Nunca se la presta a un inquilino.VS
La anon key viaja al navegador y respeta RLS. La service_role se salta RLS y se queda en el servidor. Nunca al revés.
10

No te fíes de lo que entra

Todo input se valida antes de usarse: tipo, forma, límites. En DS-FORGE lo hace Zod. En vivo no hay revisión de tipos: solo validación real cuenta.

11

Las reglas de la casa

No llaves en el navegador, RLS en cada tabla, todo input validado. El sistema revisa esto por ti. Tu trabajo es entender el porqué.

Volver a Seguridad

hecho con mucho amor

espero les sea útil

santa-ia · 2026 · @santaia.lab