Le regole di sicurezza di Firebase forniscono il controllo degli accessi e la convalida dei dati in un formato che supporta più livelli di complessità. Per creare sistemi di accesso basati su utenti e ruoli che proteggano i dati degli utenti, utilizza l'autenticazione Firebase con le regole di sicurezza Firebase.
Identifica gli utenti
L'autenticazione identifica gli utenti che richiedono l'accesso ai tuoi dati e fornisce tali informazioni come variabile che puoi sfruttare nelle tue regole. La variabile auth
contiene le seguenti informazioni:
-
uid
: un ID utente univoco, assegnato all'utente richiedente. -
token
: una mappa di valori raccolti dall'autenticazione.
La variabile auth.token
contiene i seguenti valori:
Campo | Descrizione |
---|---|
email | L'indirizzo email associato all'account, se presente. |
email_verified | true se l'utente ha verificato di avere accesso all'indirizzo email . Alcuni provider verificano automaticamente gli indirizzi email di loro proprietà. |
phone_number | Il numero di telefono associato all'account, se presente. |
name | Il nome visualizzato dell'utente, se impostato. |
sub | L'UID Firebase dell'utente. Questo è unico all'interno di un progetto. |
firebase.identities | Dizionario di tutte le identità associate all'account di questo utente. Le chiavi del dizionario possono essere una delle seguenti: email , phone , google.com , facebook.com , github.com , twitter.com . I valori del dizionario sono matrici di identificatori univoci per ogni provider di identità associato all'account. Ad esempio, auth.token.firebase.identities["google.com"][0] contiene il primo ID utente Google associato all'account. |
firebase.sign_in_provider | Il provider di accesso utilizzato per ottenere questo token. Può essere una delle seguenti stringhe: custom , password , phone , anonymous , google.com , facebook.com , github.com , twitter.com . |
firebase.tenant | TenantId associato all'account, se presente. ad esempio tenant2-m6tyz |
Se vuoi aggiungere attributi di autenticazione personalizzati, la variabile auth.token
contiene anche eventuali attestazioni personalizzate specificate.
Quando l'utente che richiede l'accesso non è connesso, la variabile auth
è null
. Puoi sfruttarlo nelle tue regole se, ad esempio, desideri limitare l'accesso in lettura agli utenti autenticati — auth != null
. Tuttavia, generalmente consigliamo di limitare ulteriormente l'accesso in scrittura.
Per ulteriori informazioni sulla variabile auth
, consulta la documentazione di riferimento per Cloud Firestore , Realtime Database e Cloud Storage .
Sfrutta le informazioni sugli utenti nelle regole
In pratica, l'utilizzo di informazioni autenticate nelle tue regole rende le tue regole più potenti e flessibili. È possibile controllare l'accesso ai dati in base all'identità dell'utente.
Nelle tue regole, definisci in che modo le informazioni nella variabile auth
(le informazioni sull'utente del richiedente) corrispondono alle informazioni sull'utente associate ai dati richiesti.
Ad esempio, la tua app potrebbe voler assicurarsi che gli utenti possano solo leggere e scrivere i propri dati. In questo scenario, vorresti una corrispondenza tra la variabile auth.uid
e l'ID utente sui dati richiesti:
CloudFirestore
service cloud.firestore {
match /databases/{database}/documents {
// Make sure the uid of the requesting user matches name of the user
// document. The wildcard expression {userId} makes the userId variable
// available in rules.
match /users/{userId} {
allow read, write: if request.auth != null && request.auth.uid == userId;
}
}
}
Database in tempo reale
{
"rules": {
"users": {
"$userId": {
// grants write access to the owner of this user account
// whose uid must exactly match the key ($userId)
".write": "$userId === auth.uid"
}
}
}
}
Archiviazione cloud
service firebase.storage {
// Only a user can upload their file, but anyone can view it
match /users/{userId}/{fileName} {
allow read;
allow write: if request.auth != null && request.auth.uid == userId;
}
}
Definire le informazioni utente personalizzate
Puoi sfruttare ulteriormente la variabile auth
per definire i campi personalizzati assegnati agli utenti della tua app.
Si supponga, ad esempio, di voler creare un ruolo di "amministratore" che abiliti l'accesso in scrittura su determinati percorsi. Assegneresti quell'attributo agli utenti e poi lo sfrutteresti nelle regole che concedono l'accesso ai percorsi.
In Cloud Firestore, puoi aggiungere un campo personalizzato ai documenti degli utenti e recuperare il valore di quel campo con una lettura incorporata nelle tue regole. Quindi, la tua regola basata sull'amministratore sarebbe simile al seguente esempio:
CloudFirestore
service cloud.firestore {
match /databases/{database}/documents/some_collection: {
// Remember that, in Cloud Firestore, reads embedded in your rules are billed operations
write: if request.auth != null && get(/databases/(database)/documents/users/$(request.auth.uid)).data.admin == true;
read: if request.auth != null;
}
}
Puoi accedere alle attestazioni personalizzate in Regole dopo aver creato attestazioni personalizzate in Autenticazione. Puoi quindi fare riferimento a tali attestazioni personalizzate utilizzando la variabile auth.token
.
CloudFirestore
service cloud.firestore {
match /databases/{database}/documents {
// For attribute-based access control, check for an admin claim
allow write: if request.auth.token.admin == true;
allow read: true;
// Alterntatively, for role-based access, assign specific roles to users
match /some_collection/{document} {
allow read: if request.auth.token.reader == "true";
allow write: if request.auth.token.writer == "true";
}
}
}
Database in tempo reale
{
"rules": {
"some_path/$sub_path": {
// Create a custom claim for the admin role
".write": "auth.uid !== null && auth.token.writer === true"
".read": "auth.uid !== null"
}
}
}
Archiviazione cloud
service firebase.storage {
// Create a custom claim for the admin role
match /files/{fileName} {
allow read: if request.auth.uid != null;
allow write: if request.auth.token.admin == true;
}
}
Per visualizzare altri esempi di regole di base che sfruttano l'autenticazione, vedere Regole di sicurezza di base .