Firebase在第二个表中写入数据的权限,用于检查第一个表中的数据

时间:2017-01-22 06:51:11

标签: firebase firebase-realtime-database

我是Firebase的新手。我正在关注this Tutorial并尝试验证数据,但不知道为什么我的数据没有验证。我想首先检查用户是否存在的作者表,如果存在则可以写入。

模拟结果

Type  write
Location  /posts/1/1
Data  { "Authors": { "1": true } }
Auth  { "provider": "google", "uid": "1" }
Admin false

拒绝写入

Line 69 (/posts/1/1)
validate: "root.child('Authors').child(newData.child('Authors').val()).exists()"

我的安全规则是:

"users": {
  "$UID": {
    ".read": "auth.uid == $UID",
    ".write": "auth.uid == $UID"
  }
},
"Authors": {
  ".read": true,
  ".write": false
},
"posts": {
  ".read": true,
  "$POSTID": {
    ".write": "auth.uid != null",
    "$UID": {
      ".validate": "root.child('Authors').child(newData.child('Authors').val()).exists()"
    }
  }
}

1 个答案:

答案 0 :(得分:1)

如果这是写入/posts/1/1的数据:

{
  "Authors": {
    "1": true
  }
}

验证规则是为表达式newData.child('Authors').val()提取以下数据:

{
  "1": true
}

这是一个对象 - 而不是一个字符串 - 因此传递给root.child('Authors').child(...)并不是一个明智的价值,这就是验证规则失败的原因。

拥有支持多位作者的结构似乎有点奇怪,但如果这是您真正想要的,那么您可以在层次结构中更深入地添加其他验证规则:

"posts": {
  ".read": true,
  "$POSTID": {
    ".write": "auth.uid != null",
    "$UID": {
      ".validate": "root.child('users').child($UID).val()).exists()",
      "Authors": {
        "$AUTHORID": {
          ".validate": "root.child('Authors').child($AUTHORID).val()).exists()",
        }
      }
    }
  }

这些规则将确保/users的{​​{1}}条目和$UID的{​​{1}}条目。这可能不是你想要的,但是,希望它会使规则本身更清晰。