Questa guida si basa sulla guida per scoprire la sintassi di base della guida in Firebase Security Rules per mostrare come aggiungere condizioni a Firebase Security Rules per Cloud Storage.
Il componente di base principale di Cloud Storage Security Rules è la condizione. R
condizione è un'espressione booleana che determina se una determinata operazione
deve essere consentito o negato. Per le regole di base, l'utilizzo di valori letterali true
e false
come condizioni funziona perfettamente. Tuttavia, il linguaggio Firebase Security Rules per Cloud Storage
offre modi per scrivere condizioni più complesse che possono:
- Controllare l'autenticazione degli utenti
- Convalida i dati in entrata
Autenticazione
Firebase Security Rules per Cloud Storage si integra con Firebase Authentication per fornire autenticazione avanzata basata sugli utenti per Cloud Storage. Ciò consente un controllo dell'accesso granulare basato sulle rivendicazioni di un token Firebase Authentication.
Quando un utente autenticato esegue una richiesta a Cloud Storage,
la variabile request.auth
viene compilata con il uid
dell'utente (request.auth.uid
) e con le attestazioni del JWT Firebase Authentication
(request.auth.token
).
Inoltre, quando utilizzi l'autenticazione personalizzata, nel campo request.auth.token
vengono visualizzati altri claim.
Quando un utente non autenticato esegue una richiesta, la variabile request.auth
è
null
.
Utilizzando questi dati, esistono diversi modi comuni per usare l'autenticazione a scopo di protezione file:
- Pubblico: ignora
request.auth
- Autenticazione privata: verifica che
request.auth
non sianull
- Utente privato: verifica che
request.auth.uid
sia uguale a un percorsouid
- Gruppo privato: verifica che le dichiarazioni del token personalizzato corrispondano a una richiesta scelta oppure leggi i metadati del file per vedere se esiste un campo di metadati
Pubblico
Qualsiasi regola che non considera il contesto request.auth
può essere considerata una
public
, poiché non prende in considerazione il contesto di autenticazione dell'utente.
Queste regole possono essere utili per mostrare dati pubblici come asset di giochi, file audio o altri contenuti statici.
// Anyone to read a public image if the file is less than 100kB // Anyone can upload a public file ending in '.txt' match /public/{imageId} { allow read: if resource.size < 100 * 1024; allow write: if imageId.matches(".*\\.txt"); }
Autenticato privato
In alcuni casi, potresti voler rendere i dati visualizzabili da tutti gli utenti autenticati di
la tua applicazione, ma non da utenti non autenticati. Dal request.auth
è null
per tutti gli utenti non autenticati, devi solo controllare
la variabile request.auth
esiste per richiedere l'autenticazione:
// Require authentication on all internal image reads match /internal/{imageId} { allow read: if request.auth != null; }
Utente privato
Il caso d'uso più comune di request.auth
sarà di gran lunga quello di fornire dati
utenti con autorizzazioni granulari sui loro file: dal caricamento delle immagini del profilo
alla lettura di documenti privati.
Poiché i file in Cloud Storage hanno un "percorso" completo al file, è sufficiente
per fare in modo che un file sia controllato da un utente è un'identificazione univoca dell'utente
informazioni nel prefisso del nome file (ad esempio, uid
dell'utente) che possono essere
selezionata quando viene valutata la regola:
// Only a user can upload their profile picture, but anyone can view it match /users/{userId}/profilePicture.png { allow read; allow write: if request.auth.uid == userId; }
Gruppo privato
Un altro caso d'uso altrettanto comune è consentire le autorizzazioni di gruppo per un oggetto, ad esempio consentendo a più membri di un team di collaborare a un documento condiviso. Là esistono diversi approcci per farlo:
- Crea un Firebase Authentication token personalizzato che contiene informazioni aggiuntive su un membro del gruppo (ad esempio un ID gruppo)
- Includi informazioni sul gruppo (ad esempio un ID gruppo o un elenco di
uid
autorizzati) nella i metadati del file
Una volta archiviati nei metadati del token o del file, a questi dati è possibile fare riferimento dall'interno di una regola:
// Allow reads if the group ID in your token matches the file metadata's `owner` property // Allow writes if the group ID is in the user's custom token match /files/{groupId}/{fileName} { allow read: if resource.metadata.owner == request.auth.token.groupId; allow write: if request.auth.token.groupId == groupId; }
Richiedi valutazione
Caricamenti, download, modifiche ed eliminazioni dei metadati vengono valutati utilizzando
Importo di request
inviato a Cloud Storage. Oltre all'ID univoco dell'utente e al payload Firebase Authentication nell'oggetto request.auth
come descritto sopra, la variabile request
contiene il percorso del file in cui viene eseguita la richiesta, la data e l'ora di ricezione della richiesta e il nuovo valore resource
se la richiesta è di scrittura.
L'oggetto request
contiene anche l'ID univoco dell'utente e il payload Firebase Authentication nell'oggetto request.auth
, che verrà spiegato ulteriormente nella sezione Sicurezza basata sugli utenti della documentazione.
Di seguito è disponibile un elenco completo delle proprietà nell'oggetto request
:
Proprietà | Tipo | Descrizione |
---|---|---|
auth |
mappa<stringa, stringa> | Quando un utente accede, fornisce uid , l'ID univoco dell'utente e
token , una mappa di Firebase Authentication dichiarazioni JWT. In caso contrario, sarà
null . |
params |
map<string, string> | Mappa contenente i parametri di query della richiesta. |
path |
percorso | Un path che rappresenta il percorso della richiesta
è stato eseguito. |
resource |
mappa<stringa, stringa> | Il nuovo valore della risorsa, presente solo nelle richieste write .
|
time |
timestamp | Un timestamp che rappresenta l'ora del server in cui viene valutata la richiesta. |
Valutazione delle risorse
Durante la valutazione delle regole, è consigliabile esaminare anche i metadati del file in fase di caricamento, download, modifica o eliminazione. Questo consente di creare regole complesse ed efficaci, ad esempio consentire solo i file con tipi di contenuti da caricare o solo i file di dimensioni superiori a una determinata dimensione eliminati.
Firebase Security Rules per Cloud Storage fornisce i metadati del file nell'oggetto resource
, che contiene coppie chiave/valore dei metadati visualizzati in un oggetto Cloud Storage. Queste proprietà possono essere ispezionate su read
o
Richieste di write
per garantire l'integrità dei dati.
Per le richieste di write
(come caricamenti, aggiornamenti ed eliminazioni di metadati), in
aggiunta all'oggetto resource
, che contiene i metadati del file
attualmente esistente nel percorso di richiesta, puoi anche utilizzare
request.resource
, che contiene un sottoinsieme dei metadati del file da utilizzare
se la scrittura è consentita. Puoi utilizzare questi due valori per garantire che i dati
l'integrità o applicare vincoli dell'applicazione come il tipo o la dimensione dei file.
Di seguito è disponibile un elenco completo delle proprietà nell'oggetto resource
:
Proprietà | Tipo | Descrizione |
---|---|---|
name |
stringa | Il nome completo dell'oggetto |
bucket |
stringa | Il nome del bucket in cui si trova l'oggetto. |
generation |
int | La Google Cloud Storage generazione di oggetti di questo oggetto. |
metageneration |
int | La Google Cloud Storage della metagenerazione dell'oggetto. |
size |
int | Le dimensioni dell'oggetto in byte. |
timeCreated |
timestamp | Un timestamp che rappresenta l'ora in cui è stato creato un oggetto. |
updated |
timestamp | Un timestamp che rappresenta l'ora dell'ultimo aggiornamento di un oggetto. |
md5Hash |
stringa | Un hash MD5 dell'oggetto. |
crc32c |
stringa | Un hash crc32c dell'oggetto. |
etag |
stringa | L'etag associato a questo oggetto. |
contentDisposition |
stringa | La disposizione dei contenuti associata a questo oggetto. |
contentEncoding |
stringa | La codifica dei contenuti associata a questo oggetto. |
contentLanguage |
stringa | La lingua dei contenuti associata a questo oggetto. |
contentType |
stringa | Il tipo di contenuti associato a questo oggetto. |
metadata |
mappa<stringa, stringa> | Coppie chiave/valore di metadati personalizzati aggiuntivi specificati dallo sviluppatore. |
request.resource
contiene tutti questi valori tranne generation
,
metageneration
, etag
, timeCreated
e updated
.
Migliora con Cloud Firestore
Puoi accedere ai documenti in Cloud Firestore per valutare altre autorizzazioni criteri.
Utilizzando le funzioni firestore.get()
e firestore.exists()
, le regole di sicurezza possono valutare le richieste in arrivo in base ai documenti in Cloud Firestore.
Entrambe le funzioni firestore.get()
e firestore.exists()
prevedono
per i percorsi dei documenti specificati. Quando usi le variabili per costruire percorsi per
firestore.get()
e firestore.exists()
, devi eseguire un escape esplicito
utilizzando la sintassi $(variable)
.
Nell'esempio che segue, vediamo una regola che limita l'accesso in lettura ai file agli utenti dagli utenti che sono membri di particolari club.
service firebase.storage { match /b/{bucket}/o { match /users/{club}/files/{fileId} { allow read: if club in firestore.get(/databases/(default)/documents/users/$(request.auth.id)).memberships } } }
service firebase.storage { match /b/{bucket}/o { match /users/{userId}/photos/{fileId} { allow read: if firestore.exists(/databases/(default)/documents/users/$(userId)/friends/$(request.auth.id)) } } }
Dopo aver creato e salvato i tuoi primi Cloud Storage Security Rules che usano questi Cloud Firestore , nella console Firebase o nell'interfaccia a riga di comando Firebase ti verrà chiesto di abilitare le autorizzazioni per collegare i due prodotti.
Puoi disabilitare la funzionalità rimuovendo un ruolo IAM, come descritto in Gestisci ed esegui il deployment di Firebase Security Rules.
Convalida dei dati
Puoi utilizzare Firebase Security Rules di Cloud Storage anche per la convalida dei dati, ad esempio
convalidare il nome e il percorso del file, nonché le proprietà dei metadati dei file come
contentType
e size
.
service firebase.storage { match /b/{bucket}/o { match /images/{imageId} { // Only allow uploads of any image file that's less than 5MB allow write: if request.resource.size < 5 * 1024 * 1024 && request.resource.contentType.matches('image/.*'); } } }
Funzioni personalizzate
Man mano che Firebase Security Rules diventa più complesso, ti consigliamo di racchiudere insiemi di condizioni in funzioni che puoi riutilizzare nel set di regole. Regole di sicurezza e supportare funzioni personalizzate. La sintassi per le funzioni personalizzate è un po' come JavaScript, ma le funzioni Firebase Security Rules sono scritte in un linguaggio specifico del dominio che presenta alcune importanti limitazioni:
- Le funzioni possono contenere una sola istruzione
return
. Non possono contenere qualsiasi logica aggiuntiva. Ad esempio, non possono eseguire loop o chiamare servizi esterni. - Functions può accedere automaticamente a funzioni e variabili dall'ambito
in cui sono definiti. Ad esempio, una funzione definita all'interno
dell'ambito
service firebase.storage
ha accesso alla variabileresource
e, solo per Cloud Firestore, alle funzioni predefinite comeget()
eexists()
. - Le funzioni possono chiamare altre funzioni ma non sono ricorrenti. La chiamata totale la profondità dello stack è limitata a 10.
- Nella versione
rules2
, le funzioni possono definire le variabili utilizzando la parola chiavelet
. Le funzioni possono avere un numero qualsiasi di associazioni Lit, ma devono terminare con un ritorno l'Informativa.
Una funzione viene definita con la parola chiave function
e prende zero o più
argomenti. Ad esempio, puoi combinare i due tipi di condizioni utilizzati
degli esempi precedenti in un'unica funzione:
service firebase.storage {
match /b/{bucket}/o {
// True if the user is signed in or the requested data is 'public'
function signedInOrPublic() {
return request.auth.uid != null || resource.data.visibility == 'public';
}
match /images/{imageId} {
allow read, write: if signedInOrPublic();
}
match /mp3s/{mp3Ids} {
allow read: if signedInOrPublic();
}
}
}
L'utilizzo delle funzioni in Firebase Security Rules ne aumenta la gestibilità in quanto la complessità delle tue regole crescono.
Passaggi successivi
Dopo questa discussione sulle condizioni, hai una conoscenza più approfondita delle Regole e puoi:
Scopri come gestire i casi d'uso principali e il flusso di lavoro per lo sviluppo, la verifica e il deployment delle regole:
- Scrivi regole che rispondano a scenari comuni.
- Approfondisci le tue conoscenze esaminando le situazioni in cui devi individuare ed evitare regole non sicure.
- Testa le regole utilizzando l'emulatore Cloud Storage e la libreria di test delle regole di sicurezza dedicata.
- Esamina i metodi disponibili per il deployment di Rules.