Règles de sécurité Firebase

Les règles de sécurité de la base de données en temps réel Firebase permettent de protéger vos données des utilisateurs non autorisés et de protéger votre structure de données..  

Dans ce tutoriel, je vais vous expliquer comment configurer correctement les règles de sécurité de votre base de données de sorte que seuls les utilisateurs autorisés disposent d'un accès en lecture ou en écriture aux données. Je vais également vous montrer comment structurer vos données pour faciliter la sécurisation.

Le problème

Supposons que nous avons des données JSON dans notre base de données Firebase, comme dans l'exemple ci-dessous:

"users": "user1": "firstName": "Chike", "lastName": "Mgbemena", "age": "89" "phoneNumber": "07012345678", "user2": "firstName ":" Godswill "," lastName ":" Okwara "," age ":" 12 "" numéro de téléphone ":" 0701234 "," user3 ": " firstName ":" Onu "," lastName ": 543," age ": 90" phoneNumber ":" 07012345678 ",…

En regardant la base de données, vous pouvez voir qu'il y a quelques problèmes avec nos données:

  1. Deux utilisateurs (utilisateur1 et utilisateur3) ont les mêmes numéros de téléphone. Nous aimerions qu'ils soient uniques.
  2. utilisateur3 a un numéro pour le nom de famille, au lieu d'une chaîne.
  3. utilisateur2 a seulement sept chiffres dans son numéro de téléphone, au lieu de 11. 
  4. La valeur d'âge pour utilisateur1 et utilisateur2 est une chaîne, alors que celle de utilisateur3 est un numéro.

Avec toutes ces failles mises en évidence dans nos données, nous avons perdu leur intégrité. Dans les étapes suivantes, je vais vous montrer comment éviter que cela ne se produise.. 

Règles permissives

La base de données temps réel Firebase a les types de règles suivants:

Type Une fonction
.lis Décrit si et quand les données sont autorisées à être lues par les utilisateurs.
.écrire Décrire si et quand les données peuvent être écrites.
.valider Définit à quoi ressemblera une valeur correctement formatée, si elle possède des attributs enfants et le type de données.
.indexOn Spécifie un enfant à indexer pour prendre en charge la commande et l'interrogation.

En savoir plus sur eux dans les documents Firebase.

Voici une règle très permissive pour le utilisateurs clé dans notre base de données. 

"rules": "users": // les utilisateurs sont lisibles par n'importe qui ".read": true, les utilisateurs // sont en écriture par n'importe qui ".write": true

C'est mauvais, car cela donne à tout le monde la possibilité de lire ou d'écrire des données dans la base de données. Tout le monde peut accéder au chemin /utilisateurs/ ainsi que des chemins plus profonds. Non seulement cela, mais aucune structure n'est imposée aux données des utilisateurs.

Règles de contrôle d'accès

"règles": "utilisateurs": "$ uid": ".read": "auth.uid == $ uid", ".write": "auth.uid == $ uid", 

Avec ces règles, nous contrôlons l'accès aux enregistrements des utilisateurs connectés. Non seulement cela, mais les utilisateurs ne peuvent que lire ou écrire leurs propres données. Nous faisons cela avec un joker: $ uid. Ceci est une variable qui représente la clé enfant (les noms de variables commencent par $). Par exemple, accéder au chemin / utilisateurs / utilisateur1, $ uid est "utilisateur1"

Ensuite, nous utilisons les auth variable, qui représente l'utilisateur actuellement authentifié. Il s'agit d'une variable de serveur prédéfinie fournie par Firebase. Aux lignes 5 et 6, nous appliquons une contrainte d'accessibilité voulant que seul l'utilisateur authentifié ayant le même identifiant que l'enregistrement de l'utilisateur puisse lire ou écrire ses données. En d’autres termes, un accès en lecture et en écriture est accordé à chaque utilisateur. /utilisateurs//, où représente l'id utilisateur actuellement authentifié.

Les autres variables de serveur Firebase sont:  

à présent Le temps actuel en millisecondes depuis l'époque Linux.
racine UNE RuleDataSnapshot représentant le chemin racine de la base de données Firebase tel qu'il existait avant l'opération tentée. 
nouvelles données UNE RuleDataSnapshot représentant les données telles qu'elles existeraient après l'opération tentée. Cela inclut les nouvelles données en cours d’écriture et les données existantes. 
Les données RuleDataSnapshot représentant les données telles qu'elles existaient avant l'opération tentée.
auth Représente la charge de jeton d'un utilisateur authentifié.

En savoir plus sur ces variables et sur d'autres variables de serveur dans la documentation Firebase.

Application de la structure de données

Nous pouvons également utiliser des règles Firebase pour appliquer des contraintes sur les données de notre base de données.. 

Par exemple, dans les règles suivantes, aux lignes 8 et 11, nous veillons à ce que toute nouvelle valeur pour le prénom et le nom de famille soit une chaîne. À la ligne 14, nous nous assurons que l'âge est un nombre. Enfin, aux lignes 17 et 18, nous imposons que la valeur du numéro de téléphone doit être une chaîne et une longueur de 11.

"règles": "utilisateurs": "$ uid": ".read": "auth.uid == $ uid", ".write": "auth.uid == $ uid", "prenom" : ".validate": "newData.isString ()", "lastName": ".validate": "newData.isString ()", "age": ".validate": "newData.isNumber ( ) "," phoneNumber ": " .validate ":" newData.isString () && newData.val (). length == 11 ",

Mais comment empêcher les numéros de téléphone en double?

Prévenir les doublons

Ensuite, je vais vous montrer comment éviter les numéros de téléphone en double..

Étape 1: normaliser la structure de données

La première chose à faire est de modifier le chemin racine pour y inclure un répertoire de niveau supérieur. /les numéros de téléphone/ nœud. Ainsi, lors de la création d'un nouvel utilisateur, nous ajouterons également le numéro de téléphone de l'utilisateur à ce nœud lorsque la validation aura abouti. Notre nouvelle structure de données se présentera comme suit:

"users": "user1": "firstName": "Chike", "lastName": "Mgbemena", "age": 89, "phoneNumber": "07012345678", "user2": "firstName" : "Godswill", "lastName": "Okwara", "age": 12 ans, "phoneNumber": "06034345453", "user3": "firstName": "Onu", "lastName": "Emeka", " age ": 90," phoneNumber ":" 09034564543 ", ...," phoneNumbers ": " 07012345678 ":" utilisateur1 "," 06034345453 ":" utilisateur2 "," 09034564543 ":" utilisateur3 ",… 

Étape 2: Appliquer la nouvelle structure de données

Nous devons modifier les règles de sécurité pour appliquer la structure de données: 

"rules": "users": "$ uid": … "phoneNumber": ".validate": "newData.isString () && newData.val (). length == 11 &&! root.child ('phoneNumbers'). child (newData.val ()). exist () ",

Ici, nous nous assurons que le numéro de téléphone est unique en vérifiant s’il est déjà un enfant du /les numéros de téléphone/ noeud avec le numéro de téléphone donné comme clé. En d'autres termes, nous vérifions que le numéro de téléphone n'a pas déjà été enregistré par un utilisateur. Si ce n'est pas le cas, la validation réussit et l'opération d'écriture sera acceptée, sinon elle sera rejetée.. 

Votre application devra ajouter le numéro de téléphone à la liste des numéros de téléphone lors de la création d'un nouvel utilisateur. Elle devra également supprimer le numéro de téléphone d'un utilisateur si cet utilisateur est supprimé..

Simulation de règles de validation et de sécurité

Vous pouvez simuler vos règles de sécurité dans la console Firebase en cliquant sur le bouton Simulateur bouton. Ajoutez vos règles de sécurité, sélectionnez le type de simulation (en lecture ou en écriture), entrez des données avec un chemin, puis cliquez sur le bouton. Courir bouton: 

Si la valeur du prénom est un nombre au lieu d'une chaîne, la validation échouera et l'accès en écriture sera refusé:

Conclusion

Dans ce tutoriel, vous avez appris les règles de sécurité de la base de données Firebase: comment empêcher les accès non autorisés aux données et comment s’assurer que les données de la base de données sont structurées.

Pour en savoir plus sur les règles de sécurité de la base de données Firebase, reportez-vous à la documentation officielle. Et consultez certains de nos autres tutoriels et cours Firebase ici sur Envato Tuts+!