Skip to main content
Questa pagina fa parte di una skill per agenti IA di programmazione ed è scritta per gli agenti, non per gli umani. Per la documentazione Base44 leggibile dagli umani, consulta la documentazione per sviluppatori.

Esempi RLS

Pattern pratici di Row-Level Security per tipi comuni di applicazioni. Importante: Base44 RLS supporta:
  • Operatori logici: $or, $and, $nor per combinare condizioni
  • Operatori sui campi (per i campi data.*): $in, $nin, $ne, $all
  • user_condition: solo uguaglianza (nessun operatore)

Contenuti


Pattern semplici (JSON Schema)

Questi pattern funzionano con il formato RLS JSON schema.

App Todo - accesso solo al proprietario

Gli utenti vedono e gestiscono solo le proprie attività.
{
  "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}}" }
  }
}

Modulo di contatto - creazione pubblica, lettura solo admin

Chiunque può inviare, solo gli admin possono visualizzare le sottomissioni.
{
  "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" } }
  }
}

Profilo utente - auto-gestione

Gli utenti possono accedere solo al proprio profilo.
{
  "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}}" }
  }
}

Dati di dipartimento - accesso allo stesso dipartimento

Gli utenti possono vedere solo i record del proprio dipartimento.
{
  "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" } }
  }
}

Abbonamento - gestito dall’admin, leggibile dall’utente tramite campo email

{
  "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: questo pattern permette solo agli utenti di leggere il proprio abbonamento. Gli admin devono usare l’interfaccia Dashboard per configurare l’accesso in lettura aggiuntivo per se stessi.

Dati privati - solo proprietario

{
  "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}}" }
  }
}

Lettura pubblica, scrittura autenticata

Chiunque può leggere, solo gli utenti loggati possono creare/modificare i propri record.
{
  "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 degli operatori

Operatori logici

Combina più condizioni usando $or, $and o $nor: Accesso proprietario O admin:
{
  "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" } }
  }
}
Più ruoli con $or:
{
  "rls": {
    "read": {
      "$or": [
        { "user_condition": { "role": "admin" } },
        { "user_condition": { "role": "manager" } },
        { "user_condition": { "role": "hr" } }
      ]
    }
  }
}

Operatori sui campi per campi data.*

Usa $in, $nin, $ne, $all per confrontare i campi data delle entità: Accesso in base ai tag ($in):
{
  "rls": {
    "read": {
      "data.category": { "$in": ["public", "shared"] }
    }
  }
}
Escludi stati specifici ($nin):
{
  "rls": {
    "read": {
      "data.status": { "$nin": ["archived", "deleted"] }
    }
  }
}
Non uguale ($ne):
{
  "rls": {
    "read": {
      "data.visibility": { "$ne": "private" }
    }
  }
}
Tutti i tag devono corrispondere ($all):
{
  "rls": {
    "read": {
      "data.required_tags": { "$all": ["approved", "reviewed"] }
    }
  }
}

Combinare operatori logici e sui campi

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

Esempi di sicurezza a livello di campo

Controlla l’accesso a campi specifici all’interno di un’entità.

Campo sensibile stipendio

{
  "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" } }
      }
    }
  }
}

Campi interni solo admin

{
  "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
      }
    }
  }
}

Pattern complessi (interfaccia Dashboard o backend)

Alcuni pattern potrebbero comunque richiedere l’interfaccia Dashboard o le funzioni backend.

Relazioni bidirezionali (ad es. amicizie, match)

Requisito: entrambe le parti in una relazione dovrebbero avere accesso. Ora possibile con $or:
{
  "rls": {
    "read": {
      "$or": [
        { "data.user_a_email": "{{user.email}}" },
        { "data.user_b_email": "{{user.email}}" }
      ]
    }
  }
}
Soluzioni alternative:
  1. Ridisegno dell’entità: memorizza due record per relazione (uno per ogni parte)
  2. Funzione backend: interroga con logica personalizzata

Logica di business complessa

Requisito: l’accesso dipende da più campi entità con condizioni complesse. Limitazione JSON Schema: anche se gli operatori aiutano, la logica di business molto complessa potrebbe comunque essere difficile da esprimere. Opzioni di soluzione:
  1. Funzione backend: implementa la logica di accesso personalizzata
  2. Combina regole più semplici: dividi le regole complesse in regole più semplici a livello di entità e di campo

Migliori pratiche

Strategia di sicurezza

Usa una combinazione di RLS a livello di entità e sicurezza a livello di campo:
Tipo di datoApproccioEsempio
Modificabile dall’utenteRLS entità: solo proprietarioUserProfile con controllo created_by
Campi sensibiliRLS a livello di campoCampo stipendio con controllo ruolo HR
Accesso multi-ruolo$or con user_conditionAccesso admin O manager
Accesso condizionaleOperatori sui campi$in, $ne su campi data
Contenuto pubblicoRLS entità: read: truePublicPost
Contenuto privatoRLS entità: solo proprietarioPrivateNote

Quando usare ogni approccio

RequisitoApproccio
Condizione singola (proprietario, admin, dipartimento)RLS JSON Schema
Più condizioni OR/ANDRLS JSON Schema con $or/$and
Controlli sui valori dei campi con $in/$ne/ecc.RLS JSON Schema per campi data.*
Controllo di accesso a livello di campoFLS JSON Schema (rls a livello di campo)
Operatori di confronto complessi ($gt, $lt)Funzioni backend
Logica di business molto complessaFunzioni backend

Pattern comuni di ruoli

RuoloAccesso tipico
adminAccesso completo a tutti i record
moderatorAccesso in lettura/aggiornamento, eliminazione limitata
managerAccesso a livello di dipartimento
userSolo record propri

Riepilogo degli operatori supportati

OperatoreSupportatoNote
$orCombina più condizioni
$andTutte le condizioni devono corrispondere
$norNessuna delle condizioni corrisponde
$inSolo per campi data.*
$ninSolo per campi data.*
$neSolo per campi data.*
$allSolo per campi data.*
$gt, $lt, $gte, $lteNoUsa funzioni backend
$regexNoUsa funzioni backend

Riepilogo delle limitazioni

Non supportatoAlternativa
Operatori su user_conditionUsa solo uguaglianza per i controlli utente
Operatori di confronto ($gt, $lt)Funzioni backend
Corrispondenza regex ($regex)Funzioni backend
Relazioni tra entitàFunzioni backend
Questa pagina è stata tradotta utilizzando l’IA. Per informazioni più accurate e aggiornate, consulta la versione inglese.