仅显示将userid作为子项的项目

时间:2015-03-20 17:14:01

标签: javascript firebase firebase-security

这是我的规则:

{
  "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"
  }

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

1 个答案:

答案 0 :(得分:3)

这是编写Firebase安全规则时常见的错误,如果我引用relevant documentation,它可能是最清楚的:

  

安全和火灾规则从上到下工作

     

这是了解安全和Firebase规则的关键概念。子规则只能为父节点已声明的内容授予其他权限。他们无法撤销读取或写入权限。

鉴于您要完成的任务,下一部分似乎也非常相关:

  

规则不是过滤器

     

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

因此,虽然您可能想要在SQL语句中考虑WHERE子句中的Firebase安全规则,但这并不是它们的工作方式。如果要为每个用户保护数据,则必须采用不同的方式对数据建模。安全指南有相当广泛的(和复杂的)example of securing a chat application