在firebase中访问相邻数据

时间:2018-06-03 22:56:47

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

让我们想象一个简单的场景:像这样在树中的firebase中的简单邮件系统:

{
 "users":{
    "user-0001":{
       "mailbox":{
        "user-0002":{
           "DSdljkdkd333klll":{
              "message":"Hi ! I am user-0002 and I sent to user-0001 a message"
           },
           "JjkJHHH8888Gggg2":{
              "message":"Hi ! It's Me, user-0002 again !"
           }
        }
     },
     "secretStuff":"Something Private - nobody can write anything here",
     "myContacts":"This is my contact list. Obviously just me can access"
    },
    "user-0002":{
       "mailbox":{
         "user-0056":{
           "DSdljkdkd333klll":{
              "message":"Party tonight ! Don't forget !"
           }
        },
        "user-0282":{
           "3893NJJj33333eddf":{
              "message":"How are you ?"
           }
        }
     },
     "secretStuff":"Something Private - nobody can write anything here",
     "myContacts":"This is my contact list. Obviously just me can access"
  }
 }
}

我作为 user-0002 ,我可以在自己的树上书写。

好的,但我应该能够在用户 - * / mailbox / user-0002处写,因为我可以向任何我想要的用户发送消息。当然:我无法访问任何其他密钥。

那么,如何归档这个:我可以在树上和相邻树上写的规则,如上例所示?

2 个答案:

答案 0 :(得分:0)

您应该将公共数据和私有数据保存在单独的顶级列表中。所以:

mailboxes
  user-0001
    user-0002:{
      "DSdljkdkd333klll":{
       "message":"Hi ! I am user-0002 and I sent to user-0001 a message"
      },
      "JjkJHHH8888Gggg2":{
       "message":"Hi ! It's Me, user-0002 again !"
      }
    }
  user-0002
    user-0056:{
      "DSdljkdkd333klll":{
       "message":"Party tonight ! Don't forget !"
      }
    },
    user-0282:{
      "3893NJJj33333eddf":{
       "message":"How are you ?"
      }
    }
contacts
  user-0001: "This is my contact list. Obviously just me can access"
  user-0002: "This is my contact list. Obviously just me can access"
secrets
  user-0001: "Something Private - nobody can write anything here"
  user-0002: "Something Private - nobody can write anything here"

现在,您可以根据信息类型保护访问权限,并加载特定类型的信息。

如果您需要特定用户的所有信息,则需要阅读这三个地方的所有信息。但鉴于您通常会为特定用户执行此操作,这些读取不是可扩展性问题。即使您需要多个用户的所有信息,但自Firebase pipelines the requests over a single connection以来通常速度非常快。

另见:

答案 1 :(得分:0)

经过更多研究和测试后,我得出结论认为这应该有用......

{
 "rules":{
  "users":{
     "$uid":{
        ".write":"$uid === auth.uid",
        ".read":"$uid === auth.uid",
        "mailbox":{
           "$uid":{
              ".write":" $uid === auth.uid"
           }
        }
     }
  }
 }
}

这意味着:

如果我是user-0001,我可以在/ users / user-0001读取/写入任何内容,但是如果路径是/ users / * / mailbox / user-0001 <我可以在别处写入/ p>