【问题标题】:Simulator shows no error in Firebase, but the permission is denied模拟器在 Firebase 中没有显示错误,但权限被拒绝
【发布时间】:2017-07-01 21:35:35
【问题描述】:

这些是我的规则:

{
  "rules": {
    "users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid",
        "username": {
      ".read": true,
          ".write": "!data.exists() && newData.exists()",
          ".validate": "newData.isString()"
        }
      }
    },
    "usernames": {
      "$username": {
        ".read": true,
        ".write": "!data.exists() && newData.exists()",
        ".validate": "newData.isString() && newData.val() == newData.parent().parent().child('users/' + auth.uid + '/username').val()"
      }
    }
  }
}

但是,在模拟器中我看到一个错误,但没有看到错误发生在哪一行。我只看到“写被拒绝”。在 XCode 的模拟器中执行此操作时,我看到“权限被拒绝”。我想检查给定的用户名是否唯一,仅此而已。

编辑:

也许我不是很清楚。模拟器确实显示错误,但不是在哪一行。然而,这是我的错误。见图1: 我在路径上犯了一个错误。

这是我的第二次尝试,图2:

在图 3 中我添加了错误描述:

这在模拟器中出错了,我可以从我的项目中添加代码,但我认为规则不好。

【问题讨论】:

  • 请编辑您的问题以包括 1) 失败的代码和 2) 允许相同操作的模拟器屏幕截图。
  • 是的,我用一些图片更新了它。够了还是我应该发更多?这是图 3:i.stack.imgur.com/o6lCg.png

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


【解决方案1】:

我会依次处理截图:

  1. 在屏幕截图 1 中,您正在尝试写信给 /usernames。没有人对/usernames(仅在其下的特定节点上)具有写入权限,因此写入失败。

  2. 在屏幕截图 2 中,您正在写信给 /usernames/myusername。但是您正在编写的数据违反了验证规则。您要编写的是 JSON 对象,而您的规则仅允许简单的字符串值。所以你可以"userUID",但你不能写{ "hello": "userUID" }

  3. 在屏幕截图 3 中,您可以看到您对此具有写入权限,如 .write 规则旁边的绿色复选标记所示。但是.validate 规则拒绝写入,因为它正在检查字符串(并且您正在发布 JSON 对象)。

【讨论】:

  • 感谢您的回答。我将 JSON 更改为“某物”。这适用于 newData.isString(),但它不会绕过第二个验证规则。看这张图:picpaste.com/plaatje4-sx4KLbXf.png我也改了UID,所以不是问题。第二条规则有什么问题?
  • 该屏幕截图没有显示足够的信息,因为我们无法看到/users/... 的现有数据。请记住,Firebase 控制台中的模拟器不能用于模拟多位置更新。见stackoverflow.com/questions/40168377/…
猜你喜欢
  • 2020-09-11
  • 2015-08-25
  • 1970-01-01
  • 2016-09-25
  • 1970-01-01
  • 2019-04-16
  • 2016-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多