仅显示具有userid作为子项的项目

Show only items that have userid as child

本文关键字:项目 显示 userid      更新时间:2023-09-26

以下是我的规则:

{
  "rules": {
    "deck":{
      ".read":true,
      ".write":true,
      ".indexOn": "user"
    }
  }
}

当前运行时:

deckRef.once('value', function(dataSnapshot) {
      console.log(dataSnapshot.ref());
    });

我得到我所有的数据返回:

{
  "deck" : {
    "-JkpwAnieKjQVsdtPD4m" : {
      "deckName" : "Deck 1",
      "user" : "simplelogin:1"
    },
    "-Jkq4unexm-qwhO_U2YO" : {
      "deckName" : "Deck 2",
      "user" : "simplelogin:1"
    },
    "-Jkq5-II1q5yM6w3ytmG" : {
      "deckName" : "Deck 3",
      "user" : "simplelogin:6"
    },
    "-Jks5mbMHmPB9MwnnOCj" : {
      "deckName" : "Deck 4",
      "user" : "simplelogin:1"
    }
  }
}

但我想阻止任何人访问与用户id不匹配的项目。

我试着把甲板部分改成:

  "deck": {
    ".read":"data.child('user').val() === auth.uid"
  }

但这没有任何回报。理想情况下,如果用户"simplelogin:1"登录,我希望它只返回项目1、2和4,如果"simplelogin:6"登录,则只返回项目3。

这是编写Firebase安全规则时常见的错误,如果我引用相关文档,这可能是最清楚的:

安全和防火墙规则自上而下运行

这是理解安全和Firebase规则的关键概念。子规则只能向已经声明的父节点授予额外的权限。他们不能撤销读或写权限。

考虑到你正在努力实现的目标,下一节似乎也非常相关:

规则不是过滤器

规则是以原子的方式应用的。这意味着,如果数据下的任何子路径不可访问,则整个读取或写入操作将立即失败。

因此,尽管您可能会倾向于将Firebase安全规则视为SQL语句中的WHERE子句,但它们并不是这样工作的。如果你想确保每个用户的数据安全,你必须想出一种不同的方法来对数据进行建模。安全指南中有一个非常广泛(复杂)的聊天应用程序安全示例。