【问题标题】:Firebase RTD recursive security ruleFirebase RTD 递归安全规则
【发布时间】:2020-07-13 19:08:36
【问题描述】:

在我的 Firebase 实时数据库中,我有如下所示的评论和回复结构。

{
  "post-comments": {
    "$postId": {
      "pushKey1": {
        "uid": "uid1",
        "text": "comment 1",
        "replies": {
          "pushKey2": {
            "uid": "uid2",
            "text": "reply 1",
            "replies": {
               ... and so on
            }
          }
        }
      }
    }
  }
}

所有 cmets 都将公开阅读。我想编写一个递归安全规则(因为可以有任意数量的嵌套 "replies" 字段),它只允许用户:

  • 如果新数据有匹配的auth.uiduid 字段,则推送
  • 如果auth.uid 与现有的uid 字段匹配,则更新评论/回复
  • 删除将通过软删除处理,因此与更新基本相同

这可能吗?我做了一些谷歌搜索,这个链接作为搜索结果出现:https://firebase.google.com/docs/rules/rules-behavior#recursive_wildcards,但页面的那个部分似乎不再存在。这个功能还存在吗?还是有其他方法可以做到这一点?如果这很重要,我将在客户端与 React 一起使用。

【问题讨论】:

  • 该文档页面指的是 Firestore,它的规则系统与实时数据库不同。

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


【解决方案1】:

从新接触实时数据库的开发人员那里看到这样的层次结构是一种常见的模式,因为它支持层次结构,所以想要使用它们是有意义的。

但是没有办法定义这样的递归安全规则。

在成熟的 Firebase 应用中看到递归数据模型也相当少见,正是因为它使访问控制变得困难。

我建议将 cmets 存储在一个平面列表中,其中包含 parentId。给顶级 cmets 一个 parentIdnone 或任何其他固定值,您可以查询所有您需要的内容。

【讨论】:

  • 我明白了,这是有道理的。谢谢! (在这里大声思考)我最初担心在扁平结构中分页会很困难,但我可以很容易地构造一个查询来查找带有parentId == null 的 N 个最近的 cmets。从那里,我可以使用parentId 字段进行另一个查询以查找回复,而不是一次加载整个前 N 个评论线程。
猜你喜欢
  • 2016-06-27
  • 1970-01-01
  • 2016-08-19
  • 2020-09-06
  • 2016-07-16
  • 1970-01-01
  • 1970-01-01
  • 2023-02-05
相关资源
最近更新 更多