【问题标题】:Firebase .validate not working as expected with $locationFirebase .validate 无法按预期使用 $location
【发布时间】:2015-04-24 03:23:25
【问题描述】:

我有以下 Firebase 规则,但无法按预期进行验证:

{
  "rules": {
    ".read": true,
    ".write": true,

    "specialItems": {
      "$itemid": {
        ".validate": "root.child('items/' + $itemid).exists()"
      }
    }
  }
}

我的 .validate 规则的目的是,“specialItems”列表中的条目只有在“items”列表中已经存在时才被接受。不幸的是,无论如何,Firebase 都允许我添加到 specialItems - 毫无疑问,因为我误解了验证应该如何工作。

我正在使用应用引擎 python urlfetch API 通过 REST 与 firebase 对话,并使用 PATCH 方法。

auth_payload = {"uid": "custom:1", "auth_data": "foo"}
token = create_token(FIREBASE_SECRET, auth_payload, {"admin": True})

url = "https:/<my-app>.firebaseio.com/specialItems.json?auth=" + token
payload = json.dumps({"myItem": "ok"})

result = urlfetch.fetch(url=url, payload=payload, method=urlfetch.PATCH)

当从一个空数据库开始时,这会给我留下一个完整的数据树,如下所示:

specialItems
  -- myItem: "ok"

我期待这棵树无法通过验证规则。我也尝试过使用 PUT,效果相同:

url = "https://<my-app>.firebaseio.com/specialItems/myItem.json?auth=" + token
result = urlfetch.fetch(url=url, payload='"ok"', method=urlfetch.PUT)

要注意的另一件事是,尽管我的规则似乎表明任何人都应该具有读/写访问权限,但我目前需要使用“admin: True”进行身份验证才能写入任何内容。让我想知道我的规则是否正在被应用——如果是这样,那么我不确定如何启用我的规则——它们就在“安全和规则”窗格中。我在这里还假设管理员不允许违反架构验证规则。

【问题讨论】:

  • 您需要立即删除根路径上的 .write: true。您基本上已授予世界对您的存储库的全局写入访问权限。 (提示:我可以 curl -x DELETE 在你的根路径上,你将有一个悲伤的一天从备份恢复)
  • 没关系 - 我专门为这个 SO 问题创建了一个单独的应用程序。现在我已经排序删除它 - 感谢您的帮助。值得注意的是,在创建新的 firebase 应用程序时,默认规则文档是:{ "rules": { ".read": true, ".write": true } } ;)

标签: python google-app-engine firebase rest-firebase


【解决方案1】:

你猜错了。使用admin: true 进行身份验证将绕过安全规则。因此,您的 .validate 规则将不会在这种情况下应用。 .validate 规则本身在物理上没有任何问题。

另外,假设您的问题准确地反映了实际情况,此处无需进行身份验证。根路径上的 .write/.read true 将允许访问 Firebase 中的任何数据。很可能,您的规则运行良好并阻止了写入,这就是为什么您错误地认为您需要 admin: true 才能写入数据。

请按照 Saeed 在他的回答中已经建议的那样检查模拟器。

【讨论】:

  • 模拟器确实显示了这一点 - 谢谢(将接受 Saeed 的回答。)。让我误入歧途的事情 - a) 文档:'一旦 .write 规则授予访问权限,就会使用 .validate 规则,以确保写入的数据符合特定标准。',b) firebase.com/docs/security /guide/securing-data.html#section-types : .validation 不读取为身份验证 c) admin:True docs: '此方法将授予服务器完整的读写访问权限' d) 不期望'权限被拒绝'验证失败。没有任何借口,只是让我认为验证不是安全性而是结构性约束的链条。
  • 不管当前状态如何,拥有一个不允许违反 .validation 规则的管理模式是很有意义的。
  • 实际上 - 在现有系统中解决这个问题的方法相当简单 - 我只是在根目录为名为“超级用户”的用户设置了 .write & .read 规则 - 即完全读/写但是验证仍然适用。
【解决方案2】:

试试下面的代码

{
  "rules": {
    ".read": true,
    ".write": true,

    "specialItems": {
      "$itemid": {
        ".validate": "root.child('items').hasChild($itemid)"
      }
    }
  }
}

您可以使用仪表板上的模拟器来测试您的规则。如果不需要身份验证,请确保您已选中“启用匿名用户身份验证”,进行身份验证,然后输入您的 url 并检查读取和写入结果。

【讨论】:

  • 在 Kato 的回答中也提到,模拟器确实解决了我的问题 - 谢谢 Saeed。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-22
  • 1970-01-01
  • 2012-12-22
  • 2015-10-15
  • 2016-10-31
  • 1970-01-01
相关资源
最近更新 更多