Firebase嵌套规则

时间:2018-01-08 10:38:00

标签: ios firebase firebase-realtime-database firebase-security

我想编写一条允许用户读取的规则,当且仅当嵌套子节点具有与auth uID相同的userId时

我的数据库结构如下

"Chats":{
  "-KDKndo4sg47f7s9":{
    "-KDlmsn4hj4h4jk2n":{
        "fromId"    :  "uid1234n5g3h34g5g5h33j33g4g43h3h3"
        "text"  : "Hi, Can you please help me on this?"
        "toId"  : "uid234553sdfj3n4hjjh3jk3h3jk4k4nm3m3"
    }
  }
}

在此数据库结构中,-KDKndo4sg47f7s9是groupId / group键,-KDlmsn4hj4h4jk2n是messageId / message键。 这是我的规则

"Chats":{
        "$groupId":{
             ".read": "data.child('$messageId').child('fromId').val() === auth.uid" ,
             ".write":"newData.child('$messageId').child('fromId').val() === auth.uid"        
            }
      }

我使用该位置测试了对规则的读访问权限 /Chats/-KDKndo4sg47f7s9和userId “uid1234n5g3h34g5g5h33j33g4g43h3h3”

始终拒绝读写。但如果我通过直接传递密钥来编写规则

"Chats":{
        "$dealId":{
              ".read": "data.child(‘-KDlmsn4hj4h4jk2n’).child('fromId').val() === auth.uid" ,
              ".write":"newData.child(‘-KDlmsn4hj4h4jk2n').child('fromId').val() === auth.uid",        
            }
      }

允许读写。 简而言之,我不想让一个用户阅读另一个用户的消息。请帮帮我。提前谢谢。

1 个答案:

答案 0 :(得分:3)

此规则不正确:

"Chats":{
  "$groupId":{
     ".read": "data.child('$messageId')"

在第三行中,您有一个字符串'$messageId'。您希望它更有可能是data.child($messageId),但这会产生语法错误,因为未定义$messageId。将$messageId放在引号中将删除语法错误,但现在它只是一个没有你想要的意义的文字字符串。

我最好的猜测是,您的数据库结构意味着/Chats/$groupId/$messageId,在这种情况下,您的规则应该反映出来:

"Chats":{
  "$groupId":{
    "$messageId":{
       ".read": "data.child($messageId).child('fromId').val() === auth.uid"

使用此规则,如果您是发件人,则可以阅读邮件。