【问题标题】:Firebase Database Rules: can't write to databaseFirebase 数据库规则:无法写入数据库
【发布时间】:2018-07-22 04:41:31
【问题描述】:

我尝试设置一些重要的写入权限,但我无法解决我的问题。有人告诉我,如果我向房间添加写入规则,那么我会覆盖我的房间/$roomID/ingame 规则。

我想做的是

由 auth 用户创建 房间。 仅由房间的创建者设置/更新房间的游戏(有效)

规则

{
  "rules": {
    ".read": true,
    "user": {
      ".indexOn": "displayname"
    },
    "room": {
      "$roomID": {
        "ingame":{
            ".write": "data.parent().child('creatorUid').val() == auth.uid"
        }
      }
    }
  }
}

创建新房间的方法:

let user = firebase.auth().currentUser
dbRoomRef.push().then((room) => {
    room.set({
        creatorUid: user.uid,
            ingame: false,
        })
    }).catch(function(err) {
        console.log(err.message)
    }
)

错误信息(如预期):

FIREBASE WARNING: set at /room/-L572bnuRv0_vntko-Bd failed: permission_denied

谢谢。

【问题讨论】:

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


    【解决方案1】:

    错误消息表明您正在尝试写/room/-L572bnuRv0_vntko-Bd 并且没有在那里写的权限。这是正确的,因为您的规则只允许写入/room/-L572bnuRv0_vntko-Bd/ingame

    如果creatorUid在你创建房间的时候已经设置好了,你就不必在你的写语句中包含它,可以这样做:

    room.child("ingame").set(false);
    

    如果您尝试允许所有人创建新房间(或写入现有房间),只要他们是所有者,您需要将规则设置更高一级:

    "room": {
      "$roomID": {
        ".write": "newData.child('creatorUid').val() == auth.uid"
      }
    }
    

    【讨论】:

    • 谢谢弗兰克!这就是我一直在寻找的。我得到了它。祝你有美好的一天。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    相关资源
    最近更新 更多