0

我火力數據庫結構是這樣的:火力地堡安全防範保存數據從其他用戶

database 
    - chat 
     -user1 
      -user2 
       -chat1 
        -message : a 
     -user2 
      -user1 
       -chat1 
        -message : a 
      -user3 
       -chat1 
        -message : a 
     -user3 
      -user2 
       -chat1 
        -message : a 

的問題是,我該如何阻止用戶(如果USER1)寫的聊天消息user2的user3

例如:

USER1的JavaScript命令上面

firebase.database().ref("chat/user2/user3/chat2").set({ 
    message: "HAHA" 
}); 

司令部說,我作爲USER1用戶3寫入新的聊天的用戶2有消息「HAHA」。我想通過Firebase規則來防止這種情況。有人可以幫助我如何編寫規則並簽署方法,我應該使用?

謝謝。

回答

1

它看起來像你有一個結構如下:

chats 
    $recipientUid 
     $senderUid 
      $chatMessageId 

保護,只有發送者可以寫爲:

{ 
    "rules": { 
    "chat": { 
     "$recipientUid": { 
     "$senderUid": { 
      ".write": "auth.uid == $senderUid" 
     } 
     } 
    } 
    } 
} 

這是比較常見的存儲特定用戶之間的郵件中一個像結構一樣的聊天室。請參閱Best way to manage Chat channels in Firebase

+0

感謝您的回答,先生,但現在的問題是,UID並非來自火力用戶的UID genereated ..這是來自用戶(用戶名)的字符串。我可以比較senderUid與用戶指定的字符串?我認爲我現在不能重組數據庫..超過500人已經使用它,我不能刪除所有這些聊天.. – RaiN

+0

爲了保護對特定用戶的數據訪問,您必須在安全規則中有某種方式才能關聯具有特定用戶的節點。這隻能通過'auth'變量來完成。最常用的屬性是'auth.uid'。除非你在製作自定義標記,否則你的「用戶名」將不會是auth變量的一部分,所以根據它不可能保證訪問的安全。 –

+0

auth.token.name如何?先生,我可以使用那個嗎? – RaiN

0

你試過從firebase documentation的數據結構嗎? ,因爲在你的情況下,我認爲這是不可能的,因此你需要扁平你的數據庫結構。儘管你可能可以使用通配符,但是由於在一個客戶端中只有一個uid,所以它仍然很難實現,因此,如果不知道前端的uid,就不能在其他用戶節點中寫入「聊天消息」。

我的建議是,嘗試通過思考「聊天參與者如何訪問他們自己的聊天數據庫?」來修改結構。您可以簡單地使用規則,每個用戶都可以在其他人可以閱讀的「聊天室」中將自己的節點寫入自己的節點。 CMIIW

問候,

RM