Skip to main content
Esta página es parte de una habilidad de agente de codificación con IA y está escrita para agentes, no para humanos. Para la documentación de Base44 legible por humanos, consulta la documentación para desarrolladores.

Ejemplos de RLS

Patrones prácticos de seguridad a nivel de fila para tipos de aplicaciones comunes. Importante: El RLS de Base44 admite:
  • Operadores lógicos: $or, $and, $nor para combinar condiciones
  • Operadores de campo (para campos data.*): $in, $nin, $ne, $all
  • user_condition: Solo igualdad (sin operadores)

Contenido


Patrones simples (JSON Schema)

Estos patrones funcionan con el formato RLS de esquema JSON.

App de tareas - Acceso solo del propietario

Los usuarios ven y gestionan solo sus propias tareas.
{
  "name": "Task",
  "type": "object",
  "properties": {
    "title": { "type": "string" },
    "description": { "type": "string" },
    "completed": { "type": "boolean" },
    "priority": { "type": "string", "enum": ["low", "medium", "high"] },
    "due_date": { "type": "string", "format": "date" }
  },
  "rls": {
    "create": true,
    "read": { "created_by": "{{user.email}}" },
    "update": { "created_by": "{{user.email}}" },
    "delete": { "created_by": "{{user.email}}" }
  }
}

Formulario de contacto - Creación pública, lectura solo de administrador

Cualquiera puede enviar, solo los administradores pueden ver los envíos.
{
  "name": "ContactSubmission",
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "email": { "type": "string", "format": "email" },
    "message": { "type": "string" }
  },
  "rls": {
    "create": true,
    "read": { "user_condition": { "role": "admin" } },
    "update": { "user_condition": { "role": "admin" } },
    "delete": { "user_condition": { "role": "admin" } }
  }
}

Perfil de usuario - Autogestión

Los usuarios solo pueden acceder a su propio perfil.
{
  "name": "UserProfile",
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "avatar_url": { "type": "string" },
    "bio": { "type": "string" },
    "preferences": { "type": "object" }
  },
  "rls": {
    "create": true,
    "read": { "created_by": "{{user.email}}" },
    "update": { "created_by": "{{user.email}}" },
    "delete": { "created_by": "{{user.email}}" }
  }
}

Datos de departamento - Acceso del mismo departamento

Los usuarios solo pueden ver registros de su departamento.
{
  "name": "DepartmentAnnouncement",
  "type": "object",
  "properties": {
    "title": { "type": "string" },
    "content": { "type": "string" },
    "department": { "type": "string" }
  },
  "rls": {
    "create": { "user_condition": { "role": "manager" } },
    "read": { "data.department": "{{user.data.department}}" },
    "update": { "user_condition": { "role": "manager" } },
    "delete": { "user_condition": { "role": "admin" } }
  }
}

Suscripción - Gestión de administrador, legible por usuario mediante campo de correo

{
  "name": "Subscription",
  "type": "object",
  "properties": {
    "user_email": { "type": "string" },
    "tier": { "type": "string", "enum": ["free", "basic", "pro", "enterprise"] },
    "credits": { "type": "number" },
    "renewal_date": { "type": "string", "format": "date" }
  },
  "rls": {
    "create": { "user_condition": { "role": "admin" } },
    "read": { "data.user_email": "{{user.email}}" },
    "update": { "user_condition": { "role": "admin" } },
    "delete": { "user_condition": { "role": "admin" } }
  }
}
Nota: Este patrón solo permite a los usuarios leer su propia suscripción. Los administradores necesitan usar la UI del panel para configurar acceso de lectura adicional para sí mismos.

Datos privados - Solo del propietario

{
  "name": "PrivateNotes",
  "type": "object",
  "properties": {
    "title": { "type": "string" },
    "content": { "type": "string" },
    "tags": { "type": "array", "items": { "type": "string" } }
  },
  "rls": {
    "create": true,
    "read": { "created_by": "{{user.email}}" },
    "update": { "created_by": "{{user.email}}" },
    "delete": { "created_by": "{{user.email}}" }
  }
}

Lectura pública, escritura autenticada

Cualquiera puede leer, solo usuarios registrados pueden crear/editar sus propios registros.
{
  "name": "BlogPost",
  "type": "object",
  "properties": {
    "title": { "type": "string" },
    "content": { "type": "string" },
    "author_email": { "type": "string" }
  },
  "rls": {
    "create": true,
    "read": true,
    "update": { "created_by": "{{user.email}}" },
    "delete": { "created_by": "{{user.email}}" }
  }
}

Uso de operadores

Operadores lógicos

Combina múltiples condiciones usando $or, $and o $nor: Acceso de propietario O administrador:
{
  "name": "Document",
  "type": "object",
  "properties": {
    "title": { "type": "string" },
    "content": { "type": "string" }
  },
  "rls": {
    "create": true,
    "read": {
      "$or": [
        { "created_by": "{{user.email}}" },
        { "user_condition": { "role": "admin" } }
      ]
    },
    "update": {
      "$or": [
        { "created_by": "{{user.email}}" },
        { "user_condition": { "role": "admin" } }
      ]
    },
    "delete": { "user_condition": { "role": "admin" } }
  }
}
Múltiples roles con $or:
{
  "rls": {
    "read": {
      "$or": [
        { "user_condition": { "role": "admin" } },
        { "user_condition": { "role": "manager" } },
        { "user_condition": { "role": "hr" } }
      ]
    }
  }
}

Operadores de campo para campos data.*

Usa $in, $nin, $ne, $all para comparar campos de datos de entidad: Acceso basado en etiquetas ($in):
{
  "rls": {
    "read": {
      "data.category": { "$in": ["public", "shared"] }
    }
  }
}
Excluir estados específicos ($nin):
{
  "rls": {
    "read": {
      "data.status": { "$nin": ["archived", "deleted"] }
    }
  }
}
No igual ($ne):
{
  "rls": {
    "read": {
      "data.visibility": { "$ne": "private" }
    }
  }
}
Todas las etiquetas deben coincidir ($all):
{
  "rls": {
    "read": {
      "data.required_tags": { "$all": ["approved", "reviewed"] }
    }
  }
}

Combinar operadores lógicos y de campo

{
  "rls": {
    "read": {
      "$and": [
        { "data.status": { "$ne": "draft" } },
        {
          "$or": [
            { "created_by": "{{user.email}}" },
            { "data.visibility": "public" }
          ]
        }
      ]
    }
  }
}

Ejemplos de seguridad a nivel de campo

Controla el acceso a campos específicos dentro de una entidad.

Campo salary sensible

{
  "name": "Employee",
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "email": { "type": "string", "format": "email" },
    "salary": {
      "type": "number",
      "description": "Annual salary",
      "rls": {
        "read": { "user_condition": { "role": "hr" } },
        "write": { "user_condition": { "role": "hr" } }
      }
    },
    "performance_notes": {
      "type": "string",
      "description": "Manager notes",
      "rls": {
        "read": {
          "$or": [
            { "user_condition": { "role": "manager" } },
            { "user_condition": { "role": "hr" } }
          ]
        },
        "write": { "user_condition": { "role": "manager" } }
      }
    }
  }
}

Campos internos solo de administrador

{
  "name": "Order",
  "type": "object",
  "properties": {
    "order_number": { "type": "string" },
    "total": { "type": "number" },
    "internal_notes": {
      "type": "string",
      "description": "Internal processing notes",
      "rls": {
        "read": { "user_condition": { "role": "admin" } },
        "write": { "user_condition": { "role": "admin" } }
      }
    },
    "profit_margin": {
      "type": "number",
      "description": "Profit margin percentage",
      "rls": {
        "read": { "user_condition": { "role": "admin" } },
        "write": false
      }
    }
  }
}

Patrones complejos (UI del panel o backend)

Algunos patrones aún pueden requerir la UI del panel o funciones de backend.

Relaciones bidireccionales (por ejemplo, amistades, coincidencias)

Requisito: Cualquiera de las partes en una relación debe tener acceso. Ahora posible con $or:
{
  "rls": {
    "read": {
      "$or": [
        { "data.user_a_email": "{{user.email}}" },
        { "data.user_b_email": "{{user.email}}" }
      ]
    }
  }
}
Soluciones alternativas:
  1. Rediseño de entidad: Almacena dos registros por relación (uno para cada parte)
  2. Función de backend: Consulta con lógica personalizada

Lógica de negocio compleja

Requisito: El acceso depende de múltiples campos de entidad con condiciones complejas. Limitación del esquema JSON: Aunque los operadores ayudan, la lógica de negocio muy compleja aún puede ser difícil de expresar. Opciones de solución:
  1. Función de backend: Implementa lógica de acceso personalizada
  2. Combina reglas más simples: Divide reglas complejas en reglas más simples a nivel de entidad y a nivel de campo

Mejores prácticas

Estrategia de seguridad

Usa una combinación de RLS a nivel de entidad y seguridad a nivel de campo:
Tipo de datoEnfoqueEjemplo
Editable por el usuarioRLS de entidad: solo propietarioUserProfile con comprobación created_by
Campos sensiblesRLS a nivel de campoCampo salary con comprobación de rol HR
Acceso multi-rol$or con user_conditionAcceso Admin O Manager
Acceso condicionalOperadores de campo$in, $ne en campos de datos
Contenido públicoRLS de entidad: read: truePublicPost
Contenido privadoRLS de entidad: solo propietarioPrivateNote

Cuándo usar cada enfoque

RequisitoEnfoque
Condición única (propietario, admin, departamento)RLS de esquema JSON
Múltiples condiciones OR/ANDRLS de esquema JSON con $or/$and
Comprobaciones de valor de campo con $in/$ne/etc.RLS de esquema JSON para campos data.*
Control de acceso a nivel de campoFLS de esquema JSON (rls a nivel de campo)
Operadores de comparación complejos ($gt, $lt)Funciones de backend
Lógica de negocio muy complejaFunciones de backend

Patrones de roles comunes

RolAcceso típico
adminAcceso total a todos los registros
moderatorAcceso de lectura/actualización, eliminación limitada
managerAcceso limitado al departamento
userSolo sus propios registros

Resumen de operadores admitidos

OperadorAdmitidoNotas
$orCombina múltiples condiciones
$andTodas las condiciones deben coincidir
$norNinguna de las condiciones coincide
$inSolo para campos data.*
$ninSolo para campos data.*
$neSolo para campos data.*
$allSolo para campos data.*
$gt, $lt, $gte, $lteNoUsa funciones de backend
$regexNoUsa funciones de backend

Resumen de limitaciones

No admitidoAlternativa
Operadores en user_conditionUsa solo igualdad para comprobaciones de usuario
Operadores de comparación ($gt, $lt)Funciones de backend
Coincidencia con regex ($regex)Funciones de backend
Relaciones entre entidadesFunciones de backend
Esta página fue traducida usando IA. Para obtener la información más precisa y actualizada, consulta la versión en inglés.