Tu app funciona.
Eso no significa que sea segura.
Auditoría de aislamiento multi-tenant en Next.js + Supabase.
Para agencias, proveedores de entidades reguladas y equipos que responden por el código que entregan.
const supabase = getServiceClient(); // ← bypasea RLSconst tenant_id = searchParams.get("tenant_id"); // ← lo elige quien llama const { data } = await supabase .from("pac_companies") .select("*") .eq("tenant_id", tenant_id);
const auth = await requireTenant(tenant_id); if (auth.error) return unauthorized(auth); const { data } = await auth.supabase // cliente con sesión .from("pac_companies") .select("*") .eq("tenant_id", tenant_id); // RLS filtra sola
Patrones
Fallos comunes en el stack que entregas
Cinco formas de perder el aislamiento entre tenants. Cada hoja es una ruta que verifica sesión y tenant; cada rama seca es una que se alcanza sin verificar nada.
¿Qué tan expuesta está tu app?
Ocho preguntas. Sin registro, sin instalar nada.
Si un usuario cambia un número en la URL, ¿puede ver información de otra cuenta?
Es el fallo más común en apps hechas con IA. Yo lo tenía en dos rutas.
¿Sabes qué pasa si alguien llama a tu app sin haber iniciado sesión?
Muchas rutas responden con datos aunque no haya sesión.
¿Tu base de datos permite que alguien sin cuenta escriba en ella?
Una política mal configurada abre la puerta a cualquiera.
¿Los correos que envía tu app incluyen texto que escribió un usuario?
Si no se escapa, se puede enviar phishing desde tu propio dominio.
¿Tienes tareas que deberían correr solas cada día? ¿Verificaste alguna vez que corran?
La mía llevaba cinco noches fallando en silencio.
¿Usas las mismas contraseñas y llaves en tu computadora que en producción?
Un archivo filtrado en local expone producción directamente.
¿Alguien revisó tu código pensando en seguridad, o solo lo escribió la IA?
El modelo optimiza para que funcione, no para que niegue accesos.
¿Guardas datos personales de tus usuarios: nombres, correos, documentos de identidad?
En Panamá eso activa obligaciones bajo la Ley 81.