2

我似乎在使用Firebase安全規則很困難。我已經閱讀了指南,但是模擬器的結果並不具有足夠的描述性(如果我們可以將鼠標懸停在某個節點上,並且彈出一個按鈕可以更新規則,那麼結果會更容易)。Firebase安全規則?

這裏是我的結構是什麼樣子:

chats 
    - randomChatId01 
    - name: "awesome chat" 
    - members: 
     - userId01 : true 
     - userId02 : true 
    - randomChatId02 
    - members: 
     - userId02 : true 
    - randomChatId03 
    - members: 
     - userId01 : true 
     - userId02 : true 
    - ... 

我只希望用戶能夠讀取聊天的節點,其中該節點的子節點成員包含驗證用戶的auth.uid

因此,在這種情況下,如果userId01進行登錄,她將只會讀randomChatId01randomChatId03訪問。

這是規則,我有:

{ 
    "rules": { 

     "chats": { 

      "$chat": { 
      ".read": "data.child('members').val().contains(auth.uid)" 
      } 
     } 
    } 
} 

但是它返回在模擬器中的以下內容:

Attempt to read /chats with auth={"provider":"anonymous","uid":"eF4ztDEXz7"} 
    /
    /chats 

No .read rule allowed the operation. 
Read was denied. 

回答

5

這是因爲火力地堡安全規則是在你從閱讀的位置進行評估。您正在嘗試閱讀/chats。用戶沒有對/chats的讀取權限,因此操作將立即失敗。

如果您將/chats/randomChatId01讀爲userId01它會成功。

這包括在文檔部分rules are not filters。另請參閱Michael Lehenbauer的答案:Restricting child/field access with security rules