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

Iva*_*ang 2 nosql data-structures firebase firebase-security firebase-realtime-database

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

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

"people": {
  "ivan": {
    "age": 23,
    "location": "Australia"
    "password": "123",
    "underGroundLover": "JLo"
  }
}
Run Code Online (Sandbox Code Playgroud)

我想隐藏password,并underGroundLover从普通观众,而他们能够获取节点ivan

根据我的理解,Firebase的授权/安全规则/节点获取逻辑只是“全有或全无”,因此,如果我想从节点中过滤掉一些秘密属性,我将不得不:

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

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

选项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")
          }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Jay*_*Jay 5

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

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

"people_public": {
  "ivan": {
    "age": 23,
    "location": "Australia"
  }
}
Run Code Online (Sandbox Code Playgroud)

而私人节点只为伊万本人

"people_private": {
  "ivan": {
    "age": 23,
    "location": "Australia"
    "password": "123",
    "underGroundLover": "JLo"
  }
}
Run Code Online (Sandbox Code Playgroud)

公共用户通常只会查看Ivan的数据,而不修改它,因此,如果Ivan决定搬到克利夫兰,他将是对其进行更新的人,因此请使用多位置更新来更新两个节点。

由于用户只能访问people_private节点中自己的节点,因此这也确实简化了安全规则。