Questa pagina è stata tradotta dall'API Cloud Translation.
Switch to English

Comprendere le regole del database in tempo reale di Firebase

Le regole del database in tempo reale di Firebase determinano chi ha accesso in lettura e scrittura al database, come sono strutturati i dati e quali indici esistono. Queste regole vivono sui server Firebase e vengono applicate automaticamente in ogni momento. Ogni richiesta di lettura e scrittura sarà completata solo se le tue regole lo consentono. Per impostazione predefinita, le tue regole non consentono a nessuno di accedere al tuo database. Questo serve a proteggere il database dagli abusi fino a quando non si ha il tempo di personalizzare le regole o impostare l'autenticazione.

Le regole del database in tempo reale hanno una sintassi simile a JavaScript e sono disponibili in quattro tipi:

Tipi di regole
.leggere Descrive se e quando gli utenti possono leggere i dati.
.Scrivi Descrive se e quando è possibile scrivere i dati.
.convalidare Definisce l'aspetto di un valore correttamente formattato, se ha attributi figlio e il tipo di dati.
.indexOn Specifica un figlio da indicizzare per supportare l'ordinamento e l'interrogazione.

Panoramica sulla sicurezza del database in tempo reale

Firebase Realtime Database offre un set completo di strumenti per la gestione della sicurezza della tua app. Questi strumenti semplificano l'autenticazione degli utenti, impongono le autorizzazioni utente e convalidano gli input.

Le app basate su Firebase eseguono più codice lato client rispetto a quelli con molte altre pile tecnologiche. Pertanto, il modo in cui affrontiamo la sicurezza potrebbe essere leggermente diverso da quello a cui sei abituato.

Autenticazione

Un primo passo comune nella protezione della tua app è l'identificazione dei tuoi utenti. Questo processo si chiama autenticazione . Puoi utilizzare l' autenticazione Firebase per consentire agli utenti di accedere alla tua app. L'autenticazione Firebase include il supporto drop-in per metodi di autenticazione comuni come Google e Facebook, nonché l'accesso tramite e-mail e password, accesso anonimo e altro.

L'identità dell'utente è un importante concetto di sicurezza. Utenti diversi hanno dati diversi e talvolta hanno capacità diverse. Ad esempio, in un'applicazione di chat, ogni messaggio è associato all'utente che lo ha creato. Gli utenti possono anche essere in grado di eliminare i propri messaggi, ma non i messaggi pubblicati da altri utenti.

Autorizzazione

L'identificazione dell'utente è solo una parte della sicurezza. Una volta che sai chi sono, hai bisogno di un modo per controllare il loro accesso ai dati nel tuo database. Le regole del database in tempo reale consentono di controllare l'accesso per ciascun utente. Ad esempio, ecco un insieme di regole di sicurezza che consente a chiunque di leggere il percorso /foo/ , ma nessuno può scrivergli:

{
  "rules": {
    "foo": {
      ".read": true,
      ".write": false
    }
  }
}

.write regole .read e .write sono in cascata, quindi questo .write regole garantisce l'accesso in lettura a tutti i dati in path /foo/ così come a qualsiasi percorso più profondo come /foo/bar/baz . Si noti che le regole .read e .write profonde nel database sovrascrivono le regole più profonde, quindi l'accesso in lettura a /foo/bar/baz sarebbe ancora concesso in questo esempio anche se una regola nel percorso /foo/bar/baz valutata come falsa.

Le regole del database in tempo reale includono variabili e funzioni integrate che consentono di fare riferimento ad altri percorsi, timestamp sul lato server, informazioni di autenticazione e altro. Ecco un esempio di una regola che concede l'accesso in scrittura per gli utenti autenticati a /users/<uid>/ , dove <uid> è l'ID dell'utente ottenuto tramite l'autenticazione Firebase.

{
  "rules": {
    "users": {
      "$uid": {
        ".write": "$uid === auth.uid"
      }
    }
  }
}

Convalida dei dati

Il database in tempo reale di Firebase è senza schemi. Ciò semplifica la modifica delle cose durante lo sviluppo, ma una volta che l'app è pronta per essere distribuita, è importante che i dati rimangano coerenti. Il linguaggio delle regole include una regola .validate che consente di applicare la logica di convalida utilizzando le stesse espressioni utilizzate per le regole .read e .write . L'unica differenza è che le regole di convalida non si sovrappongono , quindi tutte le regole di convalida rilevanti devono essere valutate su true per consentire la scrittura.

Queste regole impongono che i dati scritti in /foo/ debbano essere una stringa di meno di 100 caratteri:

{
  "rules": {
    "foo": {
      ".validate": "newData.isString() && newData.val().length < 100"
    }
  }
}

Le regole di convalida hanno accesso a tutte le stesse funzioni e variabili .write regole .read e .write . È possibile utilizzarli per creare regole di convalida che siano a conoscenza dei dati altrove nel database, dell'identità dell'utente, dell'ora del server e molto altro.

Definizione degli indici del database

Firebase Realtime Database consente di ordinare e interrogare i dati. Per dimensioni di dati ridotte, il database supporta query ad hoc, pertanto gli indici non sono generalmente richiesti durante lo sviluppo. Prima di avviare l'app, tuttavia, è importante specificare gli indici per tutte le query necessarie per assicurarsi che continuino a funzionare man mano che l'app cresce.

Gli indici vengono specificati utilizzando la regola .indexOn . Ecco una dichiarazione di indice di esempio che indicizzerebbe i campi di altezza e lunghezza per un elenco di dinosauri:

{
  "rules": {
    "dinosaurs": {
      ".indexOn": ["height", "length"]
    }
  }
}

Prossimi passi