【问题标题】:Show only items that have userid as child仅显示用户 ID 为子项的项目
【发布时间】:2015-03-20 17:14:00
【问题描述】:

这是我的规则:

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

但这不会返回任何内容。理想情况下,如果用户“simpllogin:1”已登录,我希望它只返回项目 1,2 和 4,或者如果“simplelogin:6”已登录,则返回项目 3。

【问题讨论】:

标签: javascript firebase firebase-security


【解决方案1】:

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

安全和 FireBASE 规则自上而下运作

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

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

规则不是过滤器

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

因此,尽管您可能会根据 SQL 语句中的 WHERE 子句来考虑 Firebase 安全规则,但这并不是它们的工作方式。如果你想保护每个用户的数据,你必须想出一种不同的方法来建模你的数据。安全指南有一个相当广泛(和复杂)的example of securing a chat application

【讨论】:

  • 我很担心这个。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-01
  • 1970-01-01
相关资源
最近更新 更多