Firebase安全规则 - 检查data.hasChild是否仍然失败

时间:2017-12-04 14:39:55

标签: firebase firebase-security

我有一个如下所示的安全规则:

"user_feeds": {
     "$userId": {
        ".indexOn": ["timestamp"],
        ".read": "auth != null",  
         "$postId" : {
           ".write": "auth != null && newData.parent().hasChild(newData.child('band_id').val())"
           }
         }
       }

在我的$postId子树中,我试图检查父级是否有一个节点与正在插入的数据的band_id值相对应。

数据如下:

{
   post_id: 1,
   band_id: '-L-tyesfsdf13434',
   timestamp: 34234234234
}

这些规则对应的实际树看起来像:

{
   "user_feeds": {
     "userId1": {
        "-L-tyesfsdf13434": true
     }
   }
}

我正在使用Ionic / Angular,这是我的功能,它实际上正在尝试执行写操作:

addPostToFollowers(bandId, postId) {

    // 1. Get the user's connections
    this._bands.getBandFollowers(bandId).take(1).subscribe(connections => {
      if(connections.$value !== null) {
        delete connections['$key'];
        delete connections['$exists'];

        let connectionKeys = Object.keys(connections);
        // 2. Go through those connections and add the post
        let bandFeeds = {};
        connectionKeys.forEach(connectionKey => {
          bandFeeds[`/user_feeds/${connectionKey}/${postId}`] = {
            post_id: postId,
            band_id: bandId,
            timestamp: -(+(new Date()))
          }
        })

        // 3. Update the social feeds
        this.db.object(`social`).update(bandFeeds);
      }
    })
  }

然而,当我试图运行它时,我得到了一个拒绝的权限,我不明白为什么。我在这里做错了吗?

2 个答案:

答案 0 :(得分:0)

尝试使用root.child('user_feeds').child($userId)代替newData.parent()

"user_feeds": {
 "$userId": {
    ".indexOn": ["timestamp"],
    ".read": "auth != null",  
     "$postId" : {
       ".write": "auth != null && root.child('user_feeds').child($userId)
                    .hasChild(newData.child('band_id').val())"
       }
     }
   }

我怀疑newData快照仅限于该位置的数据,parent()不能用于获取数据库树中较高位置的数据。

答案 1 :(得分:0)

所以这是我更新的规则。我需要正确引用另一条路径:

"user_feeds": {
    "$userId": {
       ".indexOn": ["timestamp"],
       "$postId" : {
          ".write": "auth != null && (root.child('social').child('user_band_follows').child($userId).hasChild(newData.child('band_id').val()) || root.child('social').child('user_band_follows').child($userId).hasChild(data.child('band_id').val()) || root.child('social').child('user_connections').child($userId).hasChild(auth.uid))"
     }
  }
}