如何在Firebase

时间:2016-05-27 14:44:00

标签: firebase data-structures firebase-realtime-database firebase-security nosql

如何在Firebase中过滤/隐藏秘密属性?

例如,如果我有数据存储:

"people": {
  "ivan": {
    "age": 23,
    "location": "Australia"
    "password": "123",
    "underGroundLover": "JLo"
  }
}

我希望隐藏passwordunderGroundLover一般受众,同时他们能够获取节点ivan

根据我的理解,Firebase的授权/安全规则/节点获取逻辑只是"全部或全部",所以如果我想从节点中过滤掉一些秘密属性,我会必须:

  1. 在将数据传递给用户之前,使用我自己的server / lambda过滤掉机密。这违背了BAAS的目的。

  2. 使用奇怪的非规范化数据结构来分隔公共可访问属性和权限所需属性。这将引入大量的n + 1个查询。

  3. 选项2带有规则的非规范化数据结构将是这样的(我知道数据和规则不能共存):

    {
      "rules": {
        "public": {
          "people": {
            ".read": true,
            "ivan": {
              "age": 23,
              "location": "Australia"
              "passwordRef": "/non-public/people/ivan/password",
              "underGroundLoverRef": "/non-public/people/ivan/underGroundLover"
            }
          }
        },
        "nonPublic": {
          "people": {
            ".read": false,
            "ivan": {
              ".read": false,
              "password": {
                ".read": if(user === "ivan" || user.group = "admin" || user.group === "ivan's parent")
              },
              "underGroundLover": {
                ".read": if(user !== "ivan's wife")
              }
            }
          }
        }
      }
    }
    

    还有其他更有效的方法可以实现过滤器吗?如果Firebase可以回答我,我也想知道为什么安全规则或数据获取必须是全有或全无?如果Firebase可以根据规则过滤/隐藏数据,那会不会很好?

1 个答案:

答案 0 :(得分:3)

一种可能的解决方案是简单地保留重复数据。 NoSQL数据库和磁盘空间的常见做法很便宜......

对于想要了解Ivan的所有用户:

"people_public": {
  "ivan": {
    "age": 23,
    "location": "Australia"
  }
}

和Ivan自己的私人节点

"people_private": {
  "ivan": {
    "age": 23,
    "location": "Australia"
    "password": "123",
    "underGroundLover": "JLo"
  }
}

公共用户通常只是在查看Ivan的数据,而不是修改它,所以如果Ivan决定搬到克利夫兰,他就会更新它,所以用多位置更新更新两个节点。 / p>

这也真正简化了安全规则,因为用户只能访问people_private节点中自己的节点。