【问题标题】:Firebase Database Security Rule Block PostsFirebase 数据库安全规则阻止帖子
【发布时间】:2021-01-29 09:50:51
【问题描述】:

我正试图阻止我的主页视图加载用户标记的帖子。

我的数据结构如下:

    "reportedPosts" : {
        "HtnULzU0lnZKYva2M2Wepl6N8wE3" : {
            "reported" : true,
        },
        "boX6rtJ98haWVxNoXfSq21maCVU2" : {
            "reported" : true,
        },
    },

    "posts" : {
        "HtnULzU0lnZKYva2M2Wepl6N8wE3" : {
            "details" : "abc",
        },
        "boX6rtJ98haWVxNoXfSq21maCVU2" : {
            "details" : "abc",
        },
        "jSMSkY9rHtdNkXoLrsFmCAXdY9n2" : {
            "details" : "abc",
        },
        "jnFhJbgCjZeJFx0hspObqoskQej2" : {
            "details" : "abc",
        },
        "r6KPesUr1qORfIJke07SloZHeNW2" : {
            "details" : "abc",
        }
    }

我的安全规则:

      "posts": {
        ".indexOn": "datestamp",
        "$post_id" : {
          // only load posts not reported
          ".read": "auth != null && !root.child('reportedPosts').hasChild($post_id)",
          ".write": "auth != null"           
        }               
      },     

      "reportedPosts" : {
        ".read": "auth != null",       
        ".write": "auth != null"        
      }

但是我得到了

/dev/posts 的侦听器失败:permission_denied

有人可以帮我解释一下吗?

【问题讨论】:

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


    【解决方案1】:

    这是设计 Firebase 数据库时的常见障碍。正如文档所说,rules are not filters 因此,如果您使某些子实体可读而其他实体不可读,您将无法再按预期获取 /posts。

    一个简单的解决方案:当一个帖子被举报时,将它从 /posts 移动到 /reportedPosts,这样它就不再存在于 /posts 下。然后,在您查看帖子后,如果帖子不违反任何规则,您可以将其移回 /posts 下。这简化了您的规则,并允许用户获取帖子列表而不会看到报告的帖子。

    【讨论】:

    • 我怎么没想到,这个解决方案不错!