Firebase数据库规则:无法写入数据库

时间:2018-02-12 03:42:40

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

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

我想做的是

由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

谢谢。

1 个答案:

答案 0 :(得分:3)

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

如果在创建会议室时已设置creatorUid,则不必将其包含在写入语句中,只需执行以下操作:

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

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

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