Firebase写入权限被拒绝。

3

我想不出为什么Firebase不让我进行这个特定的写入操作。我感觉在模拟器中我是以相同的方式进行操作,而在那里它是有效的。以下是我在此部分使用的安全规则。

"joinRequests" : {
  "$clanid": {
    "$requesterid" : {
      ".read" : "$requesterid === auth.uid || root.child('clans/' + $clanid + '/members/' + auth.uid + '/admin').val() === true",
      ".validate": "newData.hasChildren(['request'])",
      "request" : {
        ".write" : "true",
        ".validate": "newData.hasChildren(['name', 'message'])",
        "name" : {
        ".validate": "newData.isString()"
        },
        "message" : {
          ".validate": "newData.isString()"
        },
        "$other": {
        ".validate": false
        }
      },
      "approved" : {
        ".write" : "root.child('clans/' + $clanid + '/members/' + auth.uid + '/admin').val() === true || ($requesterid === auth.uid  && !newData.exists())",
        ".validate": "newData.isBoolean()"
      },
      "$other": {
      ".validate": false
      }
    }
  }
},

在我的安卓应用程序代码中,我运行了以下两行代码:
dataSnapshot.child("request").getRef().removeValue();
dataSnapshot.child("approved").getRef().removeValue();

我觉得很奇怪的是,它允许我删除“approved”值,但不允许删除“request”值。dataSnapshot是$requesterid。如果我在模拟器中运行这行代码并允许写入:

/joinRequests/QV28VJYG/c1cef959-2dd3-4cab-8649-2b81892cffa6/request

The error I get in android studio is this:

W/RepoOperation: setValue at /joinRequests/QV28VJYG/qRlJt4UIAcRVIe9VXoYVBa68tO43/request failed: DatabaseError: Permission denied

我一定是做了什么蠢事,但我无法想象是什么。任何帮助都将不胜感激,谢谢。


你能否尝试在请求中不使用这个验证规则:".validate": "newData.hasChildren(['name', 'message'])"? - André Kool
原来问题出在这一行代码上:".validate": "newData.hasChildren(['request'])",由于我的需求,我不能将allow write放在$requesterid上,所以我试图只删除子项,但是父级规则不允许。奇怪的是模拟器没有捕捉到这个问题。 - Matt
糟糕。是的,看起来模拟器界面期望的是排序过的行消息,并且在API返回未排序的行消息数组时无法突出显示某些行。我会修复它。感谢您的反馈! - tstirrat
1个回答

0

newData是表示操作执行后数据将呈现的快照。

newData.hasChildren(['request'])告诉Firebase确保在操作执行后存在request节点。 因此,禁止删除此节点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接