Firebase数据库 - 仅由创建者更改值?

时间:2018-02-11 19:49:40

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

有没有办法只允许房间的创建者(通过uid)更改准备好的值?也许在规则?我不知道。

room
    -L55EIcL2HfaGCKpKN9o
        creatorUid: "GCKpKjFHUccihC0ikxmXjnqO82"
        ready: false
        user
            -L55FCzXGL7IbPyNJXhI 
                uid: "GCKpKjFHUccihC0ikxmXjnqO82"
            -L55GK540811AQl0TDYt
                uid: "KRVpMnjjFHUccihC0C0ikxmXjF"

我试过了:

{
  "rules": {
    ".read": true,
    ".write": true,
    "room": {
      "$ready": {
        ".write": "$creatorUid == auth.uid"
      }
    }
  }
}

但我收到错误:

  

第10行:未知变量' $ creatorUid'。

创建一个包含以下JS代码的房间:

let user = firebase.auth().currentUser
                let room = dbRoomRef.push()
                room.set({
                    creatorUid: user.uid,
                    creatorName: user.displayName,
                    ingame: false,
                    timestamp: firebase.database.ServerValue.TIMESTAMP
                })

1 个答案:

答案 0 :(得分:2)

根据documentation

  

较浅的安全规则会覆盖更深层路径的规则。儿童规则   只能授予父节点已有的额外权限   声明。他们无法撤销读取或写入权限。

这意味着http://growconomy.net/img/favicon.ico".read":true将覆盖您在根节点下指定的任何其他规则。因此,您可能需要先删除".write":true行。

“房间”节点下的节点是".write":true,而不是准备好的孩子。准备好的孩子在roomID之下,所以你必须遵循这个结构:

roomID

请注意,我已使用规则中的parent()方法访问roomID节点,然后使用child()访问同一节点下的creatorUid。然后我比较它的值是否等于auth.uid。