juste une simple question: qu'est-ce qui ne va pas avec cela et pourquoi cela ne fonctionne pas?
Essayer d’obtenir un accès avec un utilisateur qui a le rôle 'admin' dans la section users du / Titres/{n'importe quel titre} mais toujours
Autorisations manquantes ou insuffisantes.
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow write: if false;
allow read: if false;
}
function userCanWrite () {
return get(/databases/{database}/documents/users/$(request.auth.uid)).data.role == "admin";
}
match /titles/{anyTitle=**} {
allow read: if request.auth != null;
allow write: if userCanWrite();
}
}
}
Voici la structure de ma base de données
J'ai essayé une autre règle de documents officiels get(/databases/{database}/documents/users/$(request.auth.uid)).data.isAdmin == true;
et cela ne fonctionne pas trop
Le support m'a aidé à trouver la solution Voici comment procéder:
structure de la base de données:
utilisateurs -> {{userid}} -> {role: "admin"}
paramètres de règle de base de données: _
get (usersPath/$ (request.auth.uid)). role == "admin" || get (usersPath/$ (request.auth.uid)). data.role == "admin";
J'ai contacté le support technique de Firebase pour signaler ce bogue et ils m'ont donné une solution temporaire à ce problème. Il semble qu'ils aient un bogue dans leurs systèmes du côté des règles de sécurité. Ils disent que la documentation est correcte, mais pour le moment, nous devrions contourner ce problème de la manière suivante:
get(path).data.field == true || get(path).field == true;
Le bogue étant que cet objet de données n'est pas renseigné, vous devez vérifier les deux propriétés. Il n'y a pas d'ETA pour le lancement d'une solution sur ce bogue, je leur ai donc demandé s'ils pouvaient me donner un conseil pour résoudre ce problème, je vais donc garder cette réponse à jour avec leurs informations.
Donc, la façon dont j'ai résolu le problème est que j'ai créé une autre Collection
appelée admins
Ensuite, je viens d'ajouter la uid
de l'utilisateur dont j'avais besoin en tant que telle - Voici la structure de ma base de données - https://i.imgur.com/RFxrKYT.png
Et voici les règles
service cloud.firestore {
match /databases/{database}/documents {
function isAdmin() {
return exists(/databases/$(database)/documents/admins/$(request.auth.uid));
}
match /tasks/{anyTask} {
allow read: if request.auth != null;
allow create: if request.auth != null;
allow update: if request.auth != null && isAdmin();
allow delete: if request.auth != null && isAdmin();
}
}
}
Vous pouvez voir mon projet Open Source complet ici: https://github.com/metaburn/doocrate
Vous devriez utiliser $(database)
au lieu de {database}
dans votre code:
get(/databases/{database}/documents/users/$(request.auth.uid)).data.role == "admin";
Ce qui a fonctionné pour moi a été de déplacer la fonction userCanWrite
au-dessus de mes règles. Il semble que la fonction doit être définie avant toute règle match
qui l’appelle. La folie :-)