Cette page a été traduite par l'API Cloud Translation.
Switch to English

Comprendre les règles de base de données Firebase Realtime

Les règles de sécurité de la base de données Firebase Realtime 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 résident 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 n'autorisent personne à 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 peuvent être lues par les utilisateurs.
.écrire Décrit si et quand l'écriture des données est autorisée.
.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 l'ordre et les requêtes.

Vue d'ensemble de la sécurité de la base de données en temps réel

La base de données Firebase Realtime 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 utilisateur et la validation des entrées.

Les applications basées sur Firebase exécutent plus de code côté client que celles dotées 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 de la sécurisation de votre application consiste à identifier vos utilisateurs. Ce processus s'appelle l' authentification . Vous pouvez utiliser l' authentification Firebase pour que les utilisateurs se connectent à votre application. L'authentification Firebase comprend 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 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

Identifier 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 de chaque utilisateur. Par exemple, voici un ensemble de règles de sécurité qui permettent à quiconque de lire le chemin /foo/ , mais à personne d'y écrire:

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

.read règles .read et .write cascade, ce jeu de règles accorde donc un accès en lecture à toutes les données de path /foo/ ainsi qu'à tous les chemins plus profonds tels que /foo/bar/baz . Notez que les règles .read et .write moins profondes dans la base de données remplacent les règles plus profondes, donc l'accès en lecture à /foo/bar/baz serait toujours accordé dans cet exemple, même si une règle au chemin /foo/bar/baz évaluée à false.

Les règles de sécurité de la base de données en temps réel incluent des variables et des fonctions intégrées qui vous permettent de faire référence à d'autres chemins, des horodatages côté serveur, des informations d'authentification, etc. Voici un exemple de règle qui accorde l'accès en écriture aux utilisateurs authentifiés à /users/<uid>/ , où <uid> est l'ID de l'utilisateur obtenu via l'authentification Firebase.

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

La validation des données

La base de données Firebase Realtime est sans schéma. Cela facilite le changement des choses 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 des règles comprend une règle .validate qui vous permet d'appliquer la logique de validation en utilisant les mêmes expressions que celles utilisées pour les règles .read et .write . 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 être évaluées à true pour que l'écriture soit autorisée.

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

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

Les règles de validation ont accès à toutes les mêmes fonctions et variables .read que les règles .read et .write . Vous pouvez les utiliser pour créer des règles de validation qui prennent en compte les données situé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 Firebase Realtime permet de classer et d'interroger les 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. Cependant, avant de lancer votre application, il est important de spécifier des index pour toutes les requêtes que vous avez pour vous assurer qu'elles continuent à fonctionner à mesure que votre application se développe.

Les index sont spécifiés à l'aide de la règle .indexOn . 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