Cloud Storage for Firebase fournit un modèle de sécurité basé sur un chemin déclaratif appelé Firebase Security Rules pour Cloud Storage, qui vous permet de sécuriser vos fichiers rapidement et facilement.
Comprendre les règles
Les Firebase Security Rules pour Cloud Storage permettent de déterminer qui a accès en lecture et en écriture
l'accès aux fichiers stockés dans Cloud Storage, ainsi que la manière dont les fichiers sont
structurées et les métadonnées
qu'elles contiennent. Le type de règle de base est allow
qui autorise les requêtes read
et write
si une valeur est spécifiée
condition est spécifiée, par exemple:
// If no condition is specified, the rule evaluates to true allow read; // Rules can optionally specify a condition allow write: if <condition>; // Rules can also specify multiple request methods allow read, write: if <condition>;
Chemins correspondants
Cloud Storage Security Rules match
les chemins d'accès utilisés pour accéder aux fichiers dans
Cloud Storage Les règles peuvent match
des chemins d'accès exacts ou des chemins d'accès génériques.
peuvent également être imbriquées. Si aucune règle de correspondance n'autorise une méthode de requête, ou si la
prend la valeur false
, la requête est refusée.
Correspondances exactes
// Exact match for "images/profilePhoto.png" match /images/profilePhoto.png { allow write: if <condition>; } // Exact match for "images/croppedProfilePhoto.png" match /images/croppedProfilePhoto.png { allow write: if <other_condition>; }
Correspondances imbriquées
// Partial match for files that start with "images" match /images { // Exact match for "images/profilePhoto.png" match /profilePhoto.png { allow write: if <condition>; } // Exact match for "images/croppedProfilePhoto.png" match /croppedProfilePhoto.png { allow write: if <other_condition>; } }
Correspondances de caractères génériques
Les règles peuvent également être utilisées pour match
un modèle à l'aide de caractères génériques. Un caractère générique est un
variable nommée qui représente une seule chaîne, telle que
profilePhoto.png
, ou plusieurs segments de chemin d'accès, tels que
images/profilePhoto.png
Un caractère générique est créé en ajoutant des accolades autour du nom générique, comme
{string}
Vous pouvez déclarer un caractère générique pour plusieurs segments en ajoutant =**
à la
un nom générique, comme {path=**}
:
// Partial match for files that start with "images" match /images { // Exact match for "images/*" // e.g. images/profilePhoto.png is matched match /{imageId} { // This rule only matches a single path segment (*) // imageId is a string that contains the specific segment matched allow read: if <condition>; } // Exact match for "images/**" // e.g. images/users/user:12345/profilePhoto.png is matched // images/profilePhoto.png is also matched! match /{allImages=**} { // This rule matches one or more path segments (**) // allImages is a path that contains all segments matched allow read: if <other_condition>; } }
Si plusieurs règles correspondent à un fichier, le résultat est le OR
du résultat de toutes
des évaluations de règles. Autrement dit, si une règle correspondante au fichier renvoie la valeur true
,
le résultat est true
.
Dans les règles ci-dessus, le fichier "images/profilePhoto.png" peut être lu si
condition
ou other_condition
a la valeur "true", tandis que le fichier
"images/users/user:12345/profilePhoto.png" n'est sujette qu'au résultat
other_condition
Une variable générique peut être référencée à partir du fichier de fourniture match
.
nom ou autorisation de chemin d'accès:
// Another way to restrict the name of a file match /images/{imageId} { allow read: if imageId == "profilePhoto.png"; }
Les Cloud Storage Security Rules ne sont pas en cascade, et les règles ne sont évaluées que lorsque l'attribut chemin de requête correspond à un chemin avec des règles spécifiées.
Demander une évaluation
Les importations, les téléchargements, les modifications de métadonnées et les suppressions sont évalués à l'aide du
request
envoyés à Cloud Storage. La variable request
contient
le chemin d'accès au fichier où la requête est exécutée, l'heure à laquelle la requête est
reçue et la nouvelle valeur resource
si la requête est une écriture. Les en-têtes HTTP et l'état d'authentification sont également inclus.
L'objet request
contient également l'ID unique de l'utilisateur et la charge utile Firebase Authentication dans l'objet request.auth
, qui sera expliquée plus en détail dans la section Sécurité basée sur l'utilisateur de la documentation.
Vous trouverez ci-dessous la liste complète des propriétés de l'objet request
:
Propriété | Type | Description |
---|---|---|
auth |
map<chaîne, chaîne> | Lorsqu'un utilisateur est connecté, fournit uid , son identifiant unique et
token , une carte de Firebase Authentication revendications JWT. Sinon, il est défini sur null . |
params |
map<chaîne, chaîne> | Carte contenant les paramètres de la requête. |
path |
chemin d'accès | Un path représentant le chemin d'accès de la requête
à l'issue de ce cours. |
resource |
map<chaîne, chaîne> | Nouvelle valeur de la ressource, présente uniquement dans les requêtes write .
|
time |
timestamp | Code temporel représentant l'heure du serveur à laquelle la requête est évaluée. |
Évaluation des ressources
Lors de l'évaluation des règles, vous pouvez également évaluer les métadonnées du fichier en cours d'importation, de téléchargement, de modification ou de suppression. Cela vous permet de créer des règles complexes et performantes, par exemple, n'autoriser que les fichiers contenant de types de contenu à importer, ou uniquement les fichiers dont la taille dépasse un certain seuil supprimés.
Firebase Security Rules pour Cloud Storage fournit des métadonnées de fichier dans resource
qui contient des paires clé/valeur des métadonnées affichées dans
Cloud Storage. Ces propriétés peuvent être inspectées sur read
ou
write
pour garantir l'intégrité des données.
Pour les requêtes write
(importations, mises à jour de métadonnées et suppressions, par exemple), dans
ainsi que l'objet resource
, qui contient les métadonnées du fichier
existant dans le chemin de requête, vous avez également la possibilité d'utiliser
request.resource
, qui contient un sous-ensemble des métadonnées du fichier à
écrit si l'écriture est autorisée. Vous pouvez utiliser ces deux valeurs pour vous assurer que les données
l'intégrité ou appliquer des contraintes d'application telles que le type ou la taille du fichier.
Vous trouverez ci-dessous la liste complète des propriétés de l'objet resource
:
Propriété | Type | Description |
---|---|---|
name |
chaîne | Nom complet de l'objet |
bucket |
chaîne | Nom du bucket dans lequel se trouve cet objet. |
generation |
int | L'API GCS génération de l'objet de cet objet. |
metageneration |
int | Métagénération de l'objet GCS de cet objet. |
size |
int | La taille de l'objet en octets. |
timeCreated |
timestamp | Code temporel représentant l'heure de création d'un objet. |
updated |
timestamp | Code temporel représentant l'heure de la dernière mise à jour d'un objet. |
md5Hash |
chaîne | Hachage MD5 de l'objet. |
crc32c |
chaîne | Hachage crc32c de l'objet. |
etag |
chaîne | ETag associé à cet objet. |
contentDisposition |
chaîne | Disposition du contenu associée à cet objet. |
contentEncoding |
chaîne | Encodage du contenu associé à cet objet. |
contentLanguage |
chaîne | Langue du contenu associée à cet objet. |
contentType |
chaîne | Type de contenu associé à cet objet. |
metadata |
map<chaîne, chaîne> | Paires clé/valeur de métadonnées personnalisées supplémentaires spécifiées par le développeur. |
request.resource
contient tous ces éléments, à l'exception de generation
,
metageneration
, etag
, timeCreated
et updated
.
Exemple complet
En combinant toutes ces données, vous pouvez créer un exemple complet de règles pour une image. solution de stockage:
service firebase.storage { match /b/{bucket}/o { match /images { // Cascade read to any image type at any path match /{allImages=**} { allow read; } // Allow write files to the path "images/*", subject to the constraints: // 1) File is less than 5MB // 2) Content type is an image // 3) Uploaded content type matches existing content type (if it exists) // 4) File name (stored in imageId wildcard variable) is less than 32 characters match /{imageId} { allow write: if request.resource.size < 5 * 1024 * 1024 && request.resource.contentType.matches('image/.*') && (resource == null || request.resource.contentType == resource.contentType) && imageId.size() < 32 } } } }
Intégrons maintenant Firebase Authentication pour un accès aux fichiers précis par utilisateur dans la section Sécurité des utilisateurs.