Si tu app está construida sobre Supabase, Row Level Security (RLS) no es opcional — es lo único que separa a un usuario logueado de los datos de todos los demás. Y es lo que más seguido sale mal en apps vibe-coded o hechas con apuro.
Por qué RLS importa tanto en Supabase
En una app de Supabase, el navegador habla directo con la base de datos usando la clave anon (pública). Por eso la base de datos misma tiene que aplicar los permisos: el cliente no es confiable. RLS es esa capa.
// Corre en el navegador, con una clave que cualquiera puede leer:
const { data } = await supabase.from('orders').select('*')Con RLS apagado, esa query devuelve todas las órdenes de todos los clientes. Con RLS activado y una política correcta, devuelve solo las del usuario actual.
RLS no viene activado por defecto
Una tabla creada en el SQL editor tiene RLS desactivado. Sin RLS no hay restricción: cualquiera con la clave anon (que es pública) lee y escribe toda la tabla.
-- Activá RLS en cada tabla
alter table orders enable row level security;Ojo: activar RLS sin políticas niega todo el acceso. La app parece rota. La solución es agregar políticas, no apagar RLS de nuevo.
Escribir políticas RLS
-- Cada usuario lee solo sus propias órdenes
create policy "read own orders"
on orders for select
using ( auth.uid() = user_id );
-- Inserta solo como sí mismo
create policy "insert own orders"
on orders for insert
with check ( auth.uid() = user_id );using filtra qué filas se ven; with check valida las nuevas. Escribí ambas en operaciones de escritura.
Los errores de RLS que filtran datos
| Error | Qué pasa |
|---|---|
| Nunca activar RLS | La tabla entera es lectura/escritura pública |
Política using ( true ) | "Existe política" pero permite a todos: igual que sin protección |
insert sin with check | Usuarios crean filas a nombre de otros |
| Clave service-role en el cliente | Saltea RLS por completo |
Cómo verificar que RLS te protege
-- Tablas con RLS apagado
select tablename, rowsecurity
from pg_tables
where schemaname = 'public' and rowsecurity = false;Y escaneá la app en vivo: Nurbak prueba tu app de Supabase desde afuera y marca las tablas legibles públicamente, más claves expuestas y headers faltantes. Pegás tu URL y tenés el informe en segundos.

