Firebase Security Rules fornisce il controllo dell'accesso e la convalida dei dati in un formato che supporta più livelli di complessità. Creare sistemi di accesso basati sugli utenti e sui ruoli che mantengono agli utenti la sicurezza dei dati, utilizza Firebase Authentication con Firebase Security Rules.
Identifica gli utenti
Authentication identifica gli utenti che richiedono l'accesso ai tuoi dati e fornisce queste informazioni come variabile che puoi utilizzare nelle tue regole. Variabile auth
contiene le seguenti informazioni:
uid
: un ID utente univoco assegnato all'utente che ha inviato la richiesta.token
: una mappa dei valori raccolti da Authentication.
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 fornitori 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. È univoco 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 array 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 |
Il tenantId associato all'account, se presente. Ad es. tenant2-m6tyz |
Se vuoi aggiungere attributi di autenticazione personalizzati, la variabile auth.token
contiene anche eventuali claim personalizzati
da te specificati.
Se l'utente che richiede l'accesso non ha eseguito l'accesso, la variabile auth
è null
.
Puoi sfruttare questa funzionalità nelle regole se, ad esempio, vuoi limitare la lettura
accesso agli utenti autenticati: auth != null
. Tuttavia, in genere consigliamo di limitare ulteriormente l'accesso in scrittura.
Per saperne di più sulla variabile auth
, consulta il riferimento
documentazione di
Cloud Firestore,
Realtime Database e
Cloud Storage
Utilizzo delle informazioni sugli utenti nelle regole
In pratica, l'utilizzo di informazioni autenticate nelle regole rende le regole più potente e flessibile. Puoi controllare l'accesso ai dati in base all'utente e identità di base.
Nelle regole, definisci in che modo le informazioni nella variabile auth
, ovvero
informazioni sull'utente del richiedente: corrispondono alle informazioni dell'utente associate al
i dati richiesti.
Ad esempio, potresti voler fare in modo che gli utenti possano solo leggere e scrivere i propri
dati personali. In questo scenario, è necessario trovare una corrispondenza tra
auth.uid
e l'ID utente sui dati richiesti:
Cloud Firestore
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;
}
}
}
Realtime Database
{
"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"
}
}
}
}
Cloud Storage
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;
}
}
Definisci informazioni utente personalizzate
Puoi utilizzare ulteriormente la variabile auth
per definire i campi personalizzati assegnati
agli utenti della tua app.
Ad esempio, supponiamo di voler creare un "amministratore" che abilita l'accesso in scrittura su determinati percorsi. Assegni questo attributo agli utenti e e poi sfruttarlo nelle regole che concedono l'accesso ai percorsi.
In Cloud Firestore, puoi aggiungere un campo personalizzato al documenti e recuperare valore di quel campo con una lettura incorporata nelle regole. Quindi, le persone che si affidano all'amministratore sarà simile al seguente esempio:
Cloud Firestore
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 rivendicazioni personalizzate in Rules dopo aver creato rivendicazioni personalizzate in Authentication. Puoi quindi
fare riferimento alle rivendicazioni personalizzate utilizzando la variabile auth.token
.
Cloud Firestore
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";
}
}
}
Realtime Database
{
"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"
}
}
}
Cloud Storage
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 altri esempi di base di Rules che sfrutta Authentication, consulta Regole di sicurezza di base.