Swift 模拟器在Firebase中未显示错误,但权限被拒绝

Swift 模拟器在Firebase中未显示错误,但权限被拒绝,swift,firebase,firebase-realtime-database,firebase-security,Swift,Firebase,Firebase Realtime Database,Firebase Security,以下是我的规则: { "rules": { "users": { "$uid": { ".read": "$uid === auth.uid", ".write": "$uid === auth.uid", "username": { ".read": true, ".write": "!data.exists() && newData.exists()",

以下是我的规则:

{
  "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中,您试图写入
    /用户名
    。没有人对
    /usernames
    (仅在其下的特定节点上)具有写入权限,因此写入失败

  • 在屏幕截图2中,您正在写入
    /usernames/myusername
    。但是您正在写入的数据违反了验证规则。您试图编写的是一个JSON对象,而您的规则只允许一个简单的字符串值。所以你可以写
    “userUID”
    ,但你不能写
    {“hello”:“userUID”}

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


  • 请编辑您的问题,包括1)失败的代码和2)允许相同操作的模拟器屏幕截图。是的,我用一些图片更新了它。这足够了吗?还是我应该发布更多?这是图3:谢谢你的回答。我将JSON改为“某物”。这适用于newData.isString(),但它不会绕过第二条验证规则。请看这张图片:我还更改了UID,所以这不是问题所在。第二条规则有什么问题?该屏幕截图没有显示足够的信息,因为我们在
    /users/…
    上看不到现有数据。请记住,Firebase控制台中的模拟器不能用于模拟多位置更新。看见