Seguridad a nivel de fila

Comprender e implementar la seguridad a nivel de fila (RLS) para proteger los datos.

Nota: Este es contenido de ejemplo/marcador de posición con fines de demostración.

La seguridad a nivel de fila (Row Level Security, RLS) es el sistema de autorización integrado de PostgreSQL que controla a qué filas de las tablas de la base de datos pueden acceder los usuarios.

¿Por qué RLS?

RLS ofrece varias ventajas:

  • Seguridad a nivel de base de datos - Protección incluso si el código de la aplicación tiene errores
  • Aplicación automática - No se necesitan comprobaciones de autorización manuales
  • Aislamiento multiinquilino - Garantiza que los usuarios solo vean sus propios datos
  • Rendimiento - Optimizado a nivel de base de datos

Habilitar RLS

Todas las tablas deben tener RLS habilitado:

ALTER TABLE your_table ENABLE ROW LEVEL SECURITY;

Patrones de políticas habituales

Acceso a la cuenta personal

CREATE POLICY "Users can access their personal account data"
  ON your_table FOR ALL
  USING (account_id = auth.uid());

Acceso a la cuenta de equipo

CREATE POLICY "Users can access their team account data"
  ON your_table FOR ALL
  USING (
    account_id IN (
      SELECT account_id FROM accounts_memberships
      WHERE user_id = auth.uid()
    )
  );

Permisos de lectura frente a escritura

-- Todos los miembros pueden leer
CREATE POLICY "Team members can view data"
  ON your_table FOR SELECT
  USING (account_id IN (SELECT get_user_accounts(auth.uid())));

-- Solo los propietarios pueden modificar
CREATE POLICY "Only owners can modify data"
  ON your_table FOR UPDATE
  USING (
    account_id IN (
      SELECT account_id FROM accounts_memberships
      WHERE user_id = auth.uid() AND role = 'owner'
    )
  );

Probar las políticas RLS

Pruebe siempre sus políticas RLS para asegurarse de que funcionan correctamente:

-- Probar como un usuario específico
SET request.jwt.claims.sub = 'user-uuid-here';

-- Intentar seleccionar datos
SELECT * FROM your_table;

-- Restablecer
RESET request.jwt.claims.sub;

Omisión de RLS por el administrador

Las claves de service role omiten RLS. Úselas con extrema precaución e implemente siempre comprobaciones de autorización manuales cuando utilice el cliente de administrador.