为什么我在Firebase中遭到拒绝?

问题描述

我正在使用angularfire并在实时数据库中进行批量更新

我没有写完整的路径到指定的对象,而是写了父母,而我传递的数据包含了其余的路径

例如,假设我有一个类似root/$date/$uid/myObject

的路径

我在规则中指定

{
  "rules": {
    "root" : {
      "$date" : {
        "$uid": {
          ".read": true,".write" : "auth.uid === $uid && $date.matches(/someregex/)"
        }
     }
  }
}

在angularfire中,我执行以下操作

const data = {
 "12-03-2020": {
   "my-user-id": {
      data: "Hello World!"
   }
 }
 "12-04-1236": {
   "my-user-id": {
      data: "Hello World!"
   }
 },"12-06-1960": {
   "my-user-id": null
 },}

this.db.object('root').update(data).then(...)

在规则测试器中编写完整路径时,一切正常,但在我的应用程序上尝试时,我得到了Permission Denied,当将write设置为true时,该方法也有效

解决方法

更新语句实际上是作为更新对象中每个顶级键的set语句列表执行的。这意味着您的代码正在尝试写入root/12-03-2020root/12-04-1236root/12-06-1960,并且那里没有写权限。

可以 执行特定属性的深度更新,但是您必须在密钥中指定属性的路径。因此,您问题中的JSON将折叠到此结构中,以(仅)对这些特定值执行深度更新:

const data = {
 "12-03-2020/my-user-id/data": "hello world!","12-04-1236/my-user-id/data": "hello world!"
 "12-06-1960/my-user-id": null
}
...