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