2017-10-06 1 views
0

Essayer de mettre en œuvre afin que l'utilisateur puisse uniquement accéder aux données de jeu pour les jeux auxquels l'utilisateur joue. Fondamentalement, si l'utilisateur fait partie de la liste des joueurs, l'utilisateur doit être capable de lire. J'ai une liste de joueurs participants dans tous les $ GameID. Tous les utilisateurs ont leur propre nom d'utilisateur unique stocké sous Users -> FirebaseID -> Valeur du nom d'utilisateur.Règles Firebase, limitant l'accès aux seuls utilisateurs participants

Je peux obtenir ce qui suit pour simuler la lecture d'un enfant dans un GameID $ où l'utilisateur fait partie de mais il ne donne pas l'accès à l'utilisateur lorsque j'essaye de lite dans mon application.

Appel à l'application:

GamesDataDatabase = FirebaseDatabase.getInstance().getReference("Games"); 
GamesDataDatabase.limitToFirst(50).addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      ...... 

Règles:

"Games": { 
     "$GameID": { 
       ".read": "root.child('Games').child($GameID).child('metaData').child('players').child(root.child('Users').child(auth.uid).child('username').val()).exists()", 

ne semble pas y avoir de différence si je remplace "données" avec root.child ('Jeux') enfant ($. gameid)

structure de données: Data tree

essayé les choses et de suite, mais ne semble pas être en mesure d'obtenir cette règle de travail ... :(

Répondre

1

Le problème commence ici Code:

GamesDataDatabase = FirebaseDatabase.getInstance().getReference("Games"); 
GamesDataDatabase.limitToFirst(50).addListenerForSingleValueEvent(... 

Ce code ne fonctionnera que si l'utilisateur a l'autorisation de lecture /Games. Si elles n'ont pas l'autorisation de lecture sur /Games, elles échoueront avec une "autorisation refusée". Si vous combinez cela avec le fait que vous ne pouvez pas supprimer les autorisations à un niveau inférieur, cela signifie que vous ne pouvez pas utiliser les règles de sécurité Firebase pour filtrer les données.

Ceci est connu comme "rules are not filters" in the Firebase documentation, et est une source courante de confusion pour les développeurs qui sont nouveaux dans le modèle de sécurité de Firebase. Je recommande que vous étudiez certains des previous questions and answers pour en savoir plus.

+0

Cela fonctionnerait-il si je devais passer à Cloud Firsestore (le nouveau programme bêta)? – Mathoa

+0

Je pense que cela peut être possible avec les règles décrites ici: https://firebase.google.com/docs/firestore/security/secure-data#shallow_queries Mais je ne l'ai pas encore essayé. –

+0

Ne devrait-il pas être possible d'ajouter read: false aux Jeux et, en raison de l'accumulation de la base de données en temps réel Firebase, il vérifie l'accès au niveau suivant (enfant)? J'ai essayé mais j'ai obtenu le même résultat, mon utilisateur dans l'application n'a pas eu accès ... (Même si la simulation donne accès ....) – Mathoa