2 votes

Document partagé des règles de sécurité de Firestore par groupe

Je suis dans une situation où un utilisateur peut créer un document et le partager avec un groupe d'autres utilisateurs. Il peut le partager avec plusieurs groupes différents. Je ne sais pas comment définir une règle pour cela.

Voici la structure de la base de données :

enter image description here

Dans le groupe, vous avez donc une liste des documents qui ont été partagés avec lui. Mon application charge le groupe dans lequel se trouve un utilisateur, puis veut charger tous les documents dans le tableau des documents. J'ai besoin d'un moyen côté serveur pour dire que c'est OK. Jusqu'à présent, seul le propriétaire du document peut le lire.

Je mets un champ dans chaque document qui contient les identifiants de chaque groupe auquel il est partagé. Je pense que je veux dire "vérifier si l'utilisateur est membre de n'importe quel groupe de la liste sharedToGroups" mais je n'arrive pas à trouver comment le faire à moins de maintenir une autre liste quelque part, disons dans le document userProfile, qui contient une liste des cercles dont l'utilisateur est membre. Même dans ce cas, j'essaierais de comparer deux listes et je ne suis pas sûr de pouvoir le faire côté client.

Ce serait bien de pouvoir obtenir l'Id du groupe d'une manière ou d'une autre à partir de l'endroit d'où la requête est émise et de voir s'il est dans le tableau sharedToGroups.

Toute aide ou tout commentaire sur la façon dont cela peut être réalisé serait grandement apprécié, peut-être faut-il une structure de base de données différente.

0voto

Lakindu Hewawasam Points 353

Vous pouvez essayer une approche de ce type :

Je ne suis pas sûr que cela puisse vous aider mais, à titre indicatif, vous pourriez peut-être activer les permissions sur les éléments suivants firestore pour le group document. Comme dans, dans les règles, pour le groupe mettre en place une fonction qui valide l'utilisateur avec l'ID de l'utilisateur stocké dans le document avec l'ID attaché dans l'authentification via la fonction firebase auth

Par conséquent, plutôt que d'essayer de limiter l'accès par document, limitez l'accès par groupe.

0voto

Nick Christensen Points 35

Je vais répondre à ma propre question. Je ne suis pas sûr que ce soit le bon protocole ici (je ne suis pas un programmeur professionnel ni un Stack Overflower expérimenté) mais cela pourrait aider quelqu'un.

J'ai fini par ajouter un champ dans le document user_profiles qui contient une liste de tous les groupes auxquels ils appartiennent. Cette liste doit être maintenue au fur et à mesure que je crée et ajoute/supprime des personnes dans les groupes, en plus de la liste des membres du groupe lui-même.

L'avantage de cette méthode est que je peux utiliser l'identifiant de l'utilisateur à partir de l'objet de demande pour obtenir ce document à partir de la base de données dans la règle de sécurité. J'ai ensuite un tableau "sharedToGroup" dans le document auquel j'essaie d'accéder et un tableau "inGroups" dans le user_profile auquel je peux également accéder. J'utilise ensuite l'opérateur hasAny pour comparer les deux tableaux et autoriser l'accès si le tableau sharedToGroup contient des valeurs du tableau inGroups.

Ma règle devient :

  match /_group/{groupId}{
      allow create: if isSignedIn();
      allow read: if isOwner() 
      || resource.data.sharedToGroup.hasAny(get(/databases/$(database)/documents/user_profiles/$(request.auth.uid)).data['inGroups']);
      allow write: if isOwner();
    }

La seule chose qui reste à faire est de sécuriser le document user_profiles pour s'assurer que même l'utilisateur ne peut pas y écrire, car je ne veux pas que quelqu'un ajoute manuellement des groupes dans son tableau.

J'espère que cela pourra aider quelqu'un un jour - comme je l'ai dit, je ne suis pas un pro ici, alors prenez-le avec des pincettes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X