我尝试设置一些重要的写入权限,但无法解决我的问题。我被告知,如果我向房间添加写入规则,那么我会覆盖我的 room/$roomID/ingame 规则。
我想做的是
由身份验证用户创建房间。 仅由房间的创建者在游戏内设置/更新房间。 (有效)
规则:
{
"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 警告:在/room/-L572bnuRv0_vntko-Bd 设置失败:permission_denied
谢谢。
最佳答案
错误消息表明您正在尝试写入 /room/-L572bnuRv0_vntko-Bd
并且无权在那里写入。这是正确的,因为您的规则仅授予写入 /room/-L572bnuRv0_vntko-Bd/ingame
的权限。
如果在创建房间时已经设置了creatorUid
,则不必将其包含在写入语句中,只需执行以下操作即可:
room.child("ingame").set(false);
如果您尝试允许每个人创建新房间(或写入现有房间),只要他们是所有者,则需要将规则设置为更高一级:
"room": {
"$roomID": {
".write": "newData.child('creatorUid').val() == auth.uid"
}
}
关于Firebase 数据库规则 : can't write to database,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48739232/