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

ErrorQué pasa
Nunca activar RLSLa 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 checkUsuarios crean filas a nombre de otros
Clave service-role en el clienteSaltea 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.

Artículos relacionados