2017-10-06 74 views
0

嘗試實施,以便用戶只能訪問用戶正在玩的遊戲的遊戲數據。 基本上,如果用戶是玩家列表的一部分,用戶應該能夠閱讀。我在所有$ GameID中都有參賽選手名單。 所有用戶都有自己的唯一用戶名,用戶名 - > FirebaseID - >用戶名值。Firebase規則,限制僅限參與用戶訪問

我可以得到以下工作,當模擬讀取$ GameID中的用戶是其中一部分的孩子,但它不給用戶訪問時,當我在我的應用程序中嘗試精簡版。

在電話應用:

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

規則:

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

似乎並沒有什麼區別,如果我取代 「數據」 與root.child( '遊戲')子($。遊戲ID)

數據結構: Data tree

試圖東西回來和第四,但似乎並沒有能夠得到這個規則的工作... :(

回答

1

這裏的問題開始代碼:

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

如果用戶有讀權限/Games此代碼纔有效。如果他們沒有對/Games的讀取權限,則會失敗並顯示「拒絕權限」。

將此情況與您無法將權限轉移到較低級別的事實相結合,這意味着您無法使用Firebase安全規則來過濾數據。

這就是所謂的"rules are not filters" in the Firebase documentation,對於新開發Firebase安全模型的開發人員來說,這是一個常見的混淆之處。我建議你學習一些previous questions and answers以瞭解更多信息。

+0

如果我要遷移到Cloud Firsestore(新測試版程序),這項工作是否可行? – Mathoa

+0

我認爲這可能確實符合這裏描述的規則:https://firebase.google.com/docs/firestore/security/secure-data#shallow_queries但我還沒有嘗試過。 –

+0

不應該有可能爲遊戲添加read:false,並且由於Firebase實時數據庫的構建,它應該檢查下一級別(子級)的訪問權限嗎? 我試過這個,但得到了同樣的結果,我的用戶在應用程序中沒有訪問權限(即使模擬允許訪問....) – Mathoa