Le regole di sicurezza del database in tempo reale di Firebase indicano come proteggere i dati da utenti non autorizzati e proteggere la struttura dei dati.
In questo tutorial di suggerimento rapido, spiegherò come configurare correttamente le regole di sicurezza del database in modo che solo gli utenti autorizzati abbiano accesso in lettura o scrittura ai dati. Ti mostrerò anche come strutturare i tuoi dati per renderlo facile da proteggere.
Supponiamo di avere dati JSON nel nostro database Firebase, come nell'esempio seguente:
"users": "user1": "firstName": "Chike", "lastName": "Mgbemena", "age": "89" "phoneNumber": "07012345678", "user2": "firstName ":" Godswill "," lastName ":" Okwara "," age ":" 12 "" phoneNumber ":" 0701234 "," user3 ": " firstName ":" Onu "," lastName ": 543," age ": 90" phoneNumber ":" 07012345678 ", ...
Guardando il database, puoi vedere che ci sono alcuni problemi con i nostri dati:
user1
e user3
) hanno gli stessi numeri di telefono. Vorremmo che questi fossero unici.user3
ha un numero per il cognome, invece di una stringa.user2
ha solo sette cifre nel loro numero di telefono, invece di 11. user1
e user2
è una stringa, mentre quella di user3
è un numero.Con tutti questi difetti evidenziati nei nostri dati, abbiamo perso l'integrità dei dati. Nei seguenti passaggi, ti mostrerò come impedire che questi si verifichino.
Il database in tempo reale di Firebase ha i seguenti tipi di regole:
genere | Funzione |
---|---|
.leggere | Descrive se e quando i dati possono essere letti dagli utenti. |
.Scrivi | Descrivi se e quando i dati possono essere scritti. |
.convalidare | Definisce l'aspetto di un valore formattato correttamente, se ha attributi figlio e il tipo di dati. |
.indexOn | Specifica un bambino da indicizzare per supportare l'ordinamento e l'interrogazione. |
Leggi di più su di loro nei documenti di Firebase.
Ecco una regola molto permissiva per il utenti
chiave nel nostro database.
"regole": "utenti": // gli utenti sono leggibili da chiunque ".read": true, // gli utenti sono scrivibili da chiunque ".write": true
Questo è male, perché dà a chiunque la possibilità di leggere o scrivere dati nel database. Chiunque può accedere al percorso / utenti /
così come percorsi più profondi. Non solo, ma nessuna struttura è imposta sui dati degli utenti.
"rules": "users": "$ uid": ".read": "auth.uid == $ uid", ".write": "auth.uid == $ uid",
Con queste regole, controlliamo l'accesso ai record dell'utente agli utenti registrati. Non solo, ma gli utenti possono solo leggere o scrivere i propri dati. Lo facciamo con un jolly: $ uid
. Questa è una variabile che rappresenta la chiave figlio (i nomi delle variabili iniziano con $
). Ad esempio, accedere al percorso / Utenti / user1
, $ uid
è "User1"
.
Successivamente, utilizziamo il auth
variabile, che rappresenta l'utente attualmente autenticato. Questa è una variabile server predefinita fornita da Firebase. Nelle righe 5 e 6, stiamo applicando un vincolo di accessibilità che solo l'utente autenticato con lo stesso id del record utente può leggere o scrivere i suoi dati. In altre parole, per ogni utente è concesso l'accesso in lettura e scrittura / utenti /
, dove
rappresenta l'id utente autenticato correntemente.
Altre variabili del server Firebase sono:
adesso | L'ora corrente in millisecondi dall'epoca di Linux. |
radice | UN RuleDataSnapshot rappresenta il percorso root nel database Firebase come esiste prima dell'operazione tentata. |
newData | UN RuleDataSnapshot rappresentando i dati come sarebbero esistiti dopo l'operazione tentata. Include i nuovi dati scritti e i dati esistenti. |
dati | Un oggetto RuleDataSnapshot che rappresenta i dati esistenti prima dell'operazione tentata. |
auth | Rappresenta un payload del token di un utente autenticato. |
Ulteriori informazioni su queste e altre variabili del server nei documenti Firebase.
Possiamo anche utilizzare le regole di Firebase per applicare i vincoli sui dati nel nostro database.
Ad esempio, nelle regole seguenti, nelle righe 8 e 11, stiamo assicurando che ogni nuovo valore per il nome e il cognome debba essere una stringa. Nella riga 14, ci assicuriamo che l'età sia un numero. Infine, nelle righe 17 e 18, stiamo applicando che il valore del numero di telefono deve essere una stringa e di lunghezza 11.
"rules": "users": "$ uid": ".read": "auth.uid == $ uid", ".write": "auth.uid == $ uid", "firstName" : ".validate": "newData.isString ()", "lastName": ".validate": "newData.isString ()", "age": ".validate": "newData.isNumber ( ) "," phoneNumber ": " .validate ":" newData.isString () && newData.val (). length == 11 ",
Ma come evitare i numeri di telefono duplicati?
Successivamente, ti mostrerò come evitare i numeri di telefono duplicati.
La prima cosa che dobbiamo fare è modificare il percorso root per includere un livello superiore /numeri di telefono/
nodo. Pertanto, quando si crea un nuovo utente, aggiungeremo il numero di telefono dell'utente a questo nodo quando la convalida ha esito positivo. La nostra nuova struttura dati sarà simile alla seguente:
"users": "user1": "firstName": "Chike", "lastName": "Mgbemena", "age": 89, "phoneNumber": "07012345678", "user2": "firstName" : "Godswill", "lastName": "Okwara", "age": 12, "phoneNumber": "06034345453", "user3": "firstName": "Onu", "lastName": "Emeka", " age ": 90," phoneNumber ":" 09034564543 ", ...," phoneNumbers ": " 07012345678 ":" user1 "," 06034345453 ":" user2 "," 09034564543 ":" user3 ", ...
Abbiamo bisogno di modificare le regole di sicurezza per applicare la struttura dei dati:
"rules": "users": "$ uid": ... "phoneNumber": ".validate": "newData.isString () && newData.val (). length == 11 &&! root.child ('phoneNumbers'). child (newData.val ()). exists () ",
Qui, ci assicuriamo che il numero di telefono sia unico controllando se è già figlio di /numeri di telefono/
nodo con il numero di telefono indicato come chiave. In altre parole, stiamo verificando che il numero di telefono non sia già stato registrato da un utente. In caso contrario, la convalida ha esito positivo e l'operazione di scrittura sarà accettata, altrimenti verrà respinta.
La tua app dovrà aggiungere il numero di telefono all'elenco dei numeri di telefono durante la creazione di un nuovo utente e sarà necessario eliminare il numero di telefono di un utente se tale utente viene eliminato.
Puoi simulare le tue regole di sicurezza nella console Firebase facendo clic su Simulatore pulsante. Aggiungi le tue regole di sicurezza, seleziona il tipo di simulazione (leggi o scrivi), inserisci alcuni dati con un percorso e fai clic su Correre pulsante:
Se il valore del primo nome è un numero anziché una stringa, la convalida fallirà e l'accesso in scrittura sarà negato:
In questa esercitazione rapida, hai appreso le regole di sicurezza del database Firebase: come impedire l'accesso non autorizzato ai dati e come assicurarti che i dati nel database siano strutturati.
Per ulteriori informazioni sulle regole di sicurezza del database Firebase, fare riferimento alla documentazione ufficiale. E dai un'occhiata ad alcuni dei nostri tutorial e corsi di Firebase qui su Envato Tuts+!