Comprendre les règles de base de données en temps réel Firebase

Les règles de sécurité de la base de données en temps réel Firebase déterminent qui a accès en lecture et en écriture à votre base de données, comment vos données sont structurées et quels index existent. Ces règles vivent sur les serveurs Firebase et sont appliquées automatiquement à tout moment. Chaque demande de lecture et d'écriture ne sera complétée que si vos règles le permettent. Par défaut, vos règles ne permettent à personne d'accéder à votre base de données. Il s'agit de protéger votre base de données contre les abus jusqu'à ce que vous ayez le temps de personnaliser vos règles ou de configurer l'authentification.

Les règles de sécurité de base de données en temps réel ont une syntaxe de type JavaScript et sont de quatre types :

Types de règles
.lis Décrit si et quand les données sont autorisées à être lues par les utilisateurs.
.écrivez Décrit si et quand les données sont autorisées à être écrites.
.valider Définit à quoi ressemblera une valeur correctement formatée, si elle a des attributs enfants et le type de données.
.indexOn Spécifie un enfant à indexer pour prendre en charge le tri et l'interrogation.

Présentation de la sécurité de la base de données en temps réel

La base de données en temps réel Firebase fournit un ensemble complet d'outils pour gérer la sécurité de votre application. Ces outils facilitent l'authentification de vos utilisateurs, l'application des autorisations des utilisateurs et la validation des entrées.

Les applications basées sur Firebase exécutent plus de code côté client que celles avec de nombreuses autres piles technologiques. Par conséquent, la façon dont nous abordons la sécurité peut être un peu différente de celle à laquelle vous êtes habitué.

Authentification

Une première étape courante dans la sécurisation de votre application consiste à identifier vos utilisateurs. Ce processus est appelé authentification. Vous pouvez utiliser Firebase authentification pour avoir les utilisateurs à se connecter à votre application. L'authentification Firebase inclut une prise en charge directe des méthodes d'authentification courantes telles que Google et Facebook, ainsi que la connexion par e-mail et mot de passe, la connexion anonyme, etc.

L'identité de l'utilisateur est un concept de sécurité important. Différents utilisateurs ont des données différentes, et parfois ils ont des capacités différentes. Par exemple, dans une application de chat, chaque message est associé à l'utilisateur qui l'a créé. Les utilisateurs peuvent également être en mesure de supprimer leurs propres messages, mais pas les messages publiés par d'autres utilisateurs.

Autorisation

L'identification de votre utilisateur n'est qu'une partie de la sécurité. Une fois que vous savez qui ils sont, vous avez besoin d'un moyen de contrôler leur accès aux données de votre base de données. Les règles de sécurité de la base de données en temps réel vous permettent de contrôler l'accès pour chaque utilisateur. Par exemple, voici un ensemble de règles de sécurité qui permet à quiconque de lire le chemin /foo/ , mais personne pour y écrire:

{
  "rules": {
    "foo": {
      ".read": true,
      ".write": false
    }
  }
}

.read et .write règles en cascade, de sorte que cette subvention ruleset accès en lecture à toutes les données au chemin /foo/ ainsi que des chemins plus profonds tels que /foo/bar/baz . Notez que .read et .write règles moins profondes dans la base de données override règles plus profondes, donc un accès en lecture /foo/bar/baz serait toujours accordée dans cet exemple , même si une règle sur le chemin /foo/bar/baz évalué à false.

La base de données en temps réel les règles de sécurité comprennent des variables intégrées et les fonctions qui vous permettent de faire référence à d' autres voies, horodatages côté serveur, les informations d'authentification, et plus encore. Voici un exemple d'une règle qui accorde un accès en écriture pour les utilisateurs authentifiés /users/<uid>/ , où <uid> est l'ID de l'utilisateur obtenu par Firebase authentification.

{
  "rules": {
    "users": {
      "$uid": {
        ".write": "$uid === auth.uid"
      }
    }
  }
}

La validation des données

La base de données en temps réel Firebase est sans schéma. Cela facilite les changements au fur et à mesure que vous développez, mais une fois que votre application est prête à être distribuée, il est important que les données restent cohérentes. Le langage de règles comprend une .validate règle qui vous permet d'appliquer une logique de validation en utilisant les mêmes expressions utilisées pour .read et .write règles. La seule différence est que les règles de validation ne sont pas en cascade, de sorte que toutes les règles de validation pertinentes doivent évaluer true pour que l'écriture soit autorisée.

Ces règles imposent que les données écrites à /foo/ doit être une chaîne moins de 100 caractères:

{
  "rules": {
    "foo": {
      ".validate": "newData.isString() && newData.val().length < 100"
    }
  }
}

Règles de validation ont accès à tous les mêmes fonctions intégrées et variables comme .read et .write règles. Vous pouvez les utiliser pour créer des règles de validation qui prennent en compte les données ailleurs dans votre base de données, l'identité de votre utilisateur, l'heure du serveur et bien plus encore.

Définition des index de base de données

La base de données en temps réel Firebase permet de commander et d'interroger des données. Pour les petites tailles de données, la base de données prend en charge les requêtes ad hoc, de sorte que les index ne sont généralement pas nécessaires pendant le développement. Avant de lancer votre application, il est cependant important de spécifier des index pour toutes les requêtes que vous devez vous assurer qu'elles continuent de fonctionner à mesure que votre application se développe.

Les index sont spécifiés à l' aide de la .indexOn règle. Voici un exemple de déclaration d'index qui indexerait les champs de hauteur et de longueur pour une liste de dinosaures :

{
  "rules": {
    "dinosaurs": {
      ".indexOn": ["height", "length"]
    }
  }
}

Prochaines étapes