【问题标题】:How to store public/private data under a node, and still query the entire node如何在一个节点下存储公共/私有数据,并且仍然查询整个节点
【发布时间】:2017-09-17 08:22:14
【问题描述】:

我想将数据存储在$user 下,其中一些数据可供公众读取,而一些数据仅供用户读取。安全规则如下所示:

{
  "rules": {      
    "users": {
      "$uid": {
        "public":{
          ".read": "auth != null",
        },
        "private": {
          ".read": "$uid === auth.uid"
        }
      }
    }
  }
}

但是,由于security rules are not filters,如果我是$user 尝试在users/$user 读取,读取将失败,对吗?有没有办法实现这一点,或者在尝试获取实际用户的所有$user 信息时,我是否总是需要同时读取users/$user/publicusers/$user/private

请注意,我想避免重复数据,以减少将重复数据与源节点保持同步的需要,以及在删除源节点时减少数据库卫生。我的模式是这样的,唯一的键是唯一的重复数据,它总是指向一个源节点作为查询的地方。

【问题讨论】:

  • 您似乎已阅读表明该方案存在问题的相关文档。我还建议阅读许多questions about using rules for filtering data 中的一些。如果这些不能解决您的问题,请分享您打算用来读取数据的代码 - 因为这是在这种情况下提供帮助的关键。

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


【解决方案1】:

如果您一次只读取一个用户的信息,您提出的结构将可以正常工作-您可以在读取公共信息时始终添加/public,或者在访问时直接读取$uid节点作为用户并希望阅读公共和私人。

但是,如果您打算进行任何类型的查询,则此数据结构根本无法工作,因为在读取公共数据的同时不读取私有数据就无法进行查询。相反,您需要将publicprivate 提升到$uid 级别之上:

users
  - public
    - $uid
  - private
    - $uid

一旦您到达这一点,是的,您必须执行两次读取才能访问这两个信息位。但请记住几件事:

  1. 私人信息只能由根据您的规则编写它的用户读取,因此您可以轻松地在用户登录后立即在此单个节点上设置一个侦听器,然后您将始终拥有它。
  2. Firebase 通过持续的实时连接进行连接,这意味着进行多次读取可能不像您想象的那么昂贵。

关于重复数据要考虑的另一件事是,Cloud Functions for Firebase 可以通过处理更新时同步来使非规范化非常轻松,而无需在客户端中围绕它进行编码。

【讨论】:

  • 感谢您提供有关数据结构的提示!我没有考虑对我正在考虑的查询的影响。我将使用您提供的结构。对于重复数据,我曾考虑使用云功能,但坚持不重复(尽可能)以降低复杂性的计划。
猜你喜欢
  • 2021-06-27
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-09
  • 1970-01-01
  • 2011-04-04
  • 1970-01-01
相关资源
最近更新 更多