0

J'ai une base de données Firebase avec les règles suivantes:règles de base de données Firebase et erreur PERMISSION_DENIED

{ 
    "rules": { 
    "messages": { 
     "$message": { 
     ".read": "true", 
     ".write": "newData.child('uid').val() === auth.uid" 
     } 
    } 
    } 
} 

La structure de données ressemble à ceci:

enter image description here

Je peux écrire sans problème , mais lorsque j'essaie de lire, j'obtiens l'erreur suivante:

Error: permission_denied at /messages: Client doesn't have permission to access the desired data. 

J'ai lu les documents Firebase, et ma structure ressemble à celle des exemples donnés. S'il vous plaît, quelqu'un peut me dire ce qui ne va pas avec ça? S'il vous plaît noter: déplacer la règle de lecture sous "messages" résout le problème mais n'est pas la solution que je veux que je veux écrire une règle basée sur les données de message (semblable à la règle d'écriture) une fois que j'ai le règle de base de travail. Je veux finir avec une règle comme ceci:

{ 
    "rules": { 
    "messages": { 
     "$message": { 
     ".read": "data.child('uid').val() === auth.uid", 
     ".write": "newData.child('uid').val() === auth.uid" 
     } 
    } 
    } 
} 

Répondre

1

Les règles que vous avez définies à /messages/$message n'affectent les requêtes faites à /messages et puisque vous ne l'avez pas ajouté d'autorisations de lecture à /messages, vous obtiennent l'autorisation refusée .

Si vous souhaitez récupérer des messages d'un utilisateur unique, envisagez de restructurer vos données pour imbriquer les messages d'un utilisateur sous son ID utilisateur, par ex.

{ 
    "rules": { 
    "user-messages": { 
     "$uid": { 
     ".read": "auth.uid === $uid", 
     "$mid": { 
      ".write": "newData.child('uid').val() === $uid" 
     } 
     } 
    } 
    } 
} 

Avec cette structure, vous pouvez récupérer tous les messages dont un utilisateur est propriétaire. Si vous souhaitez récupérer tous les messages, vous devrez également écrire des messages au /messages. Ici vous pouvez stocker les données du message, et au /user-messages/$uid, vous pouvez stocker les clés pour chaque message que l'utilisateur publie. Vous pouvez effectuer les deux écritures simultanément en utilisant des mises à jour multi-emplacement).

{ 
    "messages": { 
    "a": { "uid": "0", ... }, 
    "b": { "uid": "0", ... } 
    } 
    "user-messages": { 
    "0": { 
     "a": true, 
     "b": true 
    } 
    }, 
    "users": { 
    "0": { ... } 
    } 
} 

obtenir les clés pour les messages d'un utilisateur à user-messages/$uid puis obtenir chaque message individuel.

+0

hmmm .. J'ai commencé avec une structure comme ça mais mon problème est que j'ai deux cas d'utilisation; Un où un utilisateur obtient de voir seulement leurs propres messages, et deux où un administrateur peut voir tous les messages. La requête d'administration doit pouvoir être filtrée par des attributs tels qu'un message ouvert ou fermé. Lorsque j'ai essayé de le faire avec une structure plus imbriquée, j'ai trouvé que l'écriture de la requête d'administration était impossible (trop d'imbrication). On dirait que je suis de retour à la planche à dessin ... :-( –

+0

Donc, seul l'administrateur peut voir tous les messages? Et donc un utilisateur ne peut voir leurs messages? – Callam

+0

Oui, c'est vrai J'ai un jeton que je peux identifier Le problème est de structurer les données pour que je puisse les interroger et que les utilisateurs puissent lire leurs propres messages –