如何在一个用户创建但可供组内用户访问的Firebase中构建数据?

时间:2017-01-17 21:03:25

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

所以,假设我有这样的数据:

{ 
  "events" : { 
   "s0d980983s" : 
    { creator: "bob@bob.com",
      text: "Bob says 'My name is Robert'" },
   "kjl34jl234j" : 
    { creator: "fred@fred.com",
      text: "Fred says 'My name is Fredrick'" }
  }
  "users" : { 
   "bob@bob.com" : { "paid": true },
   "fred@fred.com" : { "paid": false }
  }
}

我认为这是构建数据的正确方法。创建数据后,我使用push()方法为数据创建新密钥,然后将数据的创建者存储在其中。

我想这样做:

  • 我可以允许一组用户中的任何人访问某些数据(显然不允许其他人)。
  • 查询是“优化的”,这意味着如果我有数千条记录,我不会迭代所有数据。

更具体地说,例如,我希望lizzie@lizzie.com能够看到s0d980983s

我很困惑如何构建数据,以及我的Firebase规则应该是什么样的。

会是这样的吗?

{ "events" : { 
  "s0d980983s" : 
    { creator: "bob@bob.com",
      viewers: { "bob@bob.com": true,
                 "lizzie@lizzie.com" : true },
      text: "Bob says 'My name is Robert'" },
 ...
}

我不明白如何搜索一组用户可以查看的事件。我不相信Firebase支持某种通配符,这会使这段代码正常工作,对吗?

var ref = firebase.database().ref( "events/*/viewers/lizzie@lizzie.com" ).on(...);

我还想引用users表中的事件吗?我不确定我是否理解如何展平数据(反规范化)并在两个地方保留引用以支持这样的查询。我是否应该在我首先检索存储在用户对象中的事件列表然后使用其密钥逐个检索它们时进行多个查询?但是,如何将该逻辑放入我的firebase规则中呢?

1 个答案:

答案 0 :(得分:0)

{ "events" : { 
      "s0d980983s" : 
      { creator: "bob@bob.com",
        viewers: { "[insert bobs id]": true,
                    "[insert liz id]" : true 
                 },
      text: "Bob says 'My name is Robert'" },
      ...
}

根据您的建议基于上述结构,如果您使用firebase身份验证对用户进行身份验证,则可以添加另一个' read'或者'写'用于检查该用户是否在您的“观看者”列表中的规则。类似的东西:

{
  "rules": {
    "users": {
      "$uid": {
        ".write": "auth != null && 
          root.child('users').child(auth.uid).child('viewers').child(auth.uid).val() == 
          true"
      }
    }
  }
}

这应该有所帮助。 setting firebase security rules at a location/node