Firebase Security Rules forniscono il controllo dell'accesso e la convalida dei dati in un formato che supporta diversi livelli di complessità. Per creare sistemi di accesso basati su utenti e ruoli che proteggono i dati degli utenti, utilizza Firebase Authentication con Firebase Security Rules.
Identificare 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. La variabile auth
contiene le seguenti informazioni:
uid
: un ID utente univoco assegnato all'utente che effettua 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. Deve essere 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.
Quando l'utente che richiede l'accesso non ha eseguito l'accesso, la variabile auth
è null
.
Puoi sfruttare questa funzionalità nelle tue regole se, ad esempio, vuoi limitare l'accesso in lettura agli utenti autenticati (auth != null
). Tuttavia, consigliamo in genere
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.
Utilizzare le informazioni utente nelle regole
In pratica, l'utilizzo di informazioni autenticate nelle regole le rende più efficaci e flessibili. Puoi controllare l'accesso ai dati in base all'identità dell'utente.
Nelle regole, definisci in che modo le informazioni nella variabile auth
, ovvero le informazioni utente del richiedente, corrispondono alle informazioni utente associate ai dati richiesti.
Ad esempio, potresti voler assicurarti che gli utenti possano leggere e scrivere solo i propri dati. In questo caso, è consigliabile una corrispondenza tra la variabile auth.uid
e l'ID utente nei 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;
}
}
Definire informazioni utente personalizzate
Puoi sfruttare ulteriormente la variabile auth
per definire campi personalizzati assegnati agli utenti della tua app.
Ad esempio, supponiamo di voler creare un ruolo "amministratore" che consenta l'accesso in scrittura su determinati percorsi. Assegnerai questo attributo agli utenti e poi lo utilizzerai 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 regole. Pertanto, la regola basata sull'amministratore avrà il seguente aspetto:
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 le rivendicazioni personalizzate in Authentication. Puoi quindi fare riferimento a questi claim personalizzati 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 utilizzo di Rules di base per Authentication, consulta Regole di sicurezza di base.