2016-07-31 78 views
1

工作何時使用.read與用戶節點上的真正的規則火力地堡規則,我給訪問一些身份驗證的用戶閱讀上樹中列出的每個用戶。那我只需要一些。,像一個過濾器

我需要一些規則,就像一個過濾器。因此,在獲取用戶/路徑時,此已認證的用戶將獲得一個的用戶數組,只有的用戶擁有像$uid > permission > auth.uid = true這樣的權限路徑。

{ 
    "rules": { 
    "Users" : { 
     ".read": true, 
     "$uid" : { 
     ".read" : "(auth != null && auth.uid === $uid) || root.child('Users/'+ $uid+'/permission/'+ auth.uid).val() == true", 
     ".write" : false 
     } 
    }, 
    } 
} 
+1

見http://stackoverflow.com/questions/14296625/restricting-child-field-access-with-security-rules –

回答

2

您不能將規則用作過濾器,它們對於您要讀取/寫入的特定分支是原子的。

你的外讀取的規則是給訪問整個/Users分支。刪除它並獲得你想閱讀的userId會得到你期望的行爲。所以,不幸的是,這隻有在與ref.child("Users").child(targetUserId).once...一起閱讀時纔有效。

{ 
    "rules": { 
    "Users" : { 
     "$uid" : { 
     ".read" : "(auth != null && auth.uid === $uid) || root.child('Users/'+ $uid+'/permission/'+ auth.uid).val() == true", 
     ".write" : false 
     } 
    } 
    } 
} 

如果你想擁有,在一個單一的呼叫,用戶ID列表的身份驗證的用戶可以訪問我建議你真正保存訪問用戶內部/User/userId而不是讓那些可以閱讀。而你的規則會稍微改變。

{ 
     "rules": { 
     "Users" : { 
      "$uid" : { 
      ".read" : "(auth != null && auth.uid === $uid) || root.child('Users/'+ auth.uid +'/accessibleUsers/'+ $uid).val() == true", 
      ".write" : false 
      } 
     } 
     } 
    } 

此外,縮放,所以當,這取決於你規劃你的應用是什麼,你應該考慮有這個訪問用戶在一個單獨的分支表(用戶外)的這可能會很複雜。

+0

我明白了。我正在寫這篇文章(https://www.airpair.com/firebase/posts/structuring-your-firebase-data)說的,所以我遇到了這個問題。我會嘗試你的方法。 – calebeaires