Le regole di sicurezza di Firebase Realtime Database determinano chi ha accesso in lettura e scrittura al database, come sono strutturati i dati e quali indici esistono. Queste regole risiedono sui server Firebase e vengono applicate automaticamente in ogni momento. Ogni richiesta di lettura e scrittura verrà completata solo se le regole lo consentono. Per impostazione predefinita, le regole non consentono a nessuno di accedere al database. In questo modo, il database viene protetto da utilizzi illeciti finché non hai il tempo di personalizzare le regole o configurare l'autenticazione.
Le regole di sicurezza di Realtime Database hanno una sintassi simile a JavaScript e sono di quattro tipi:
| Tipi di regole | |
|---|---|
| .read | Descrive se e quando gli utenti possono leggere i dati. |
| .write | Descrive se e quando è consentita la scrittura dei dati. |
| .validate | Definisce l'aspetto di un valore con formato corretto, se ha attributi secondari e il tipo di dati. |
| .indexOn | Specifica un elemento secondario da indicizzare per supportare l'ordinamento e le query. |
Realtime Database panoramica della sicurezza
Il Firebase Realtime Database fornisce un set completo di strumenti per gestire la sicurezza della tua app. Questi strumenti semplificano l'autenticazione degli utenti, l'applicazione delle autorizzazioni utente e la convalida degli input.
Le app basate su Firebase eseguono più codice lato client rispetto a quelle con molti altri stack tecnologici. Pertanto, il nostro approccio alla sicurezza potrebbe essere leggermente diverso da quello a cui sei abituato.
Autenticazione
Un primo passo comune per proteggere la tua app è identificare gli utenti. Questa procedura è chiamata autenticazione. Puoi utilizzare Firebase Authentication per consentire agli utenti di accedere alla tua app. Firebase Authentication include il supporto immediato per i metodi di autenticazione comuni come Google e Facebook, nonché l'accesso con indirizzo email e password, l'accesso anonimo e altro ancora.
L'identità dell'utente è un concetto di sicurezza importante. Utenti diversi hanno dati diversi e, a volte, funzionalità diverse. Ad esempio, in un'applicazione di chat, ogni messaggio è associato all'utente che lo ha creato. Gli utenti possono anche eliminare i propri messaggi, ma non quelli 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 database. Le regole di sicurezza di Realtime Database ti consentono di controllare l'accesso per ogni utente. Ad esempio, ecco un insieme di regole di sicurezza che consente a chiunque di leggere il percorso /foo/, ma a nessuno di scriverci:
{
"rules": {
"foo": {
".read": true,
".write": false
}
}
}Le regole .read e .write sono a cascata, quindi questo insieme di regole
concede l'accesso in lettura a tutti i dati nel percorso /foo/ e a tutti i percorsi più profondi
come /foo/bar/baz. Tieni presente che le regole .read e .write più superficiali nel database sostituiscono le regole più profonde, quindi l'accesso in lettura a /foo/bar/baz verrebbe comunque concesso in questo esempio anche se una regola nel percorso /foo/bar/baz restituisce false.
Le regole di sicurezza di Realtime Database includono
variabili e funzioni integrate
che ti consentono
di fare riferimento ad altri percorsi, timestamp lato server, informazioni di autenticazione,
e altro ancora. Ecco un esempio di regola che concede l'accesso in scrittura agli utenti autenticati a /users/<uid>/, dove <uid> è l'ID dell'utente ottenuto tramite Firebase Authentication.
{
"rules": {
"users": {
"$uid": {
".write": "$uid === auth.uid"
}
}
}
}Convalida dei dati
Il Firebase Realtime Database non ha uno schema. In questo modo è facile modificare le cose durante lo sviluppo, ma una volta che l'app è pronta per la distribuzione, è importante che i dati rimangano coerenti. Il linguaggio delle regole include una regola .validate che ti 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 sono a cascata, quindi tutte le regole di convalida pertinenti
devono restituire true per consentire la scrittura.
Queste regole impongono che i dati scritti in /foo/ devono 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 integrate delle regole .read e .write. Puoi utilizzarle per creare regole di convalida che tengano conto dei dati presenti in altre parti del database, dell'identità dell'utente, dell'ora del server e molto altro ancora.
Definizione degli indici del database
Il Firebase Realtime Database consente di ordinare ed eseguire query sui dati. Per le dimensioni ridotte dei dati, il database supporta le query ad hoc, quindi in genere gli indici non sono necessari durante lo sviluppo. Prima di lanciare l'app, però, è importante specificare gli indici per tutte le query in modo che continuino a funzionare man mano che l'app cresce.
Gli indici vengono specificati utilizzando la regola .indexOn. Di seguito è riportato un esempio di dichiarazione di indice che indicizza i campi height e length per un elenco di dinosauri:
{
"rules": {
"dinosaurs": {
".indexOn": ["height", "length"]
}
}
}Passaggi successivi
- Inizia a pianificare lo sviluppo delle regole per il tuo database.
- Scopri di più sulla protezione dei dati utilizzando le regole di sicurezza.
- Scopri di più sulla specifica degli indici utilizzando le regole.