如何针对安全规则检查不同集合中的新文档?

时间:2017-10-21 16:41:50

标签: firebase firebase-security google-cloud-firestore

因此,在实时数据库中,当我进行扇出写入时,我可以通过安全规则中的newData().parent().parent()...parent()检查要在各种路径中写入的新数据。

e.g。

const fanout = {
  'users/user_a': {
    username: 'foobar'
  },

  'usernames': {
    'foobar': 'user_a'
  }
};

firebase.update(fanout);

这样的安全性:

"rules": {
  "users": {
    $user_id: {
      "username": {
        ".validate": "newData.parent().parent().parent().child('usernames').child(newData.val()).val() == auth.uid;
      }
    }
  },

  "usernames": {
    "$username": {
      ".validate": "newData.parent().parent().child('users').child(auth.uid).child('username').val() == $username"
    }
  }
}

如果想知道在Firestore的安全规则中是否有办法做到这一点?我已经看到了exists()功能,但它仅适用于现有文档,而不是即将编写的文档。

1 个答案:

答案 0 :(得分:0)

不幸的是,目前Cloud Firestore规则中没有相同的功能。您可以使用request.resource.data检查请求中写入的数据,但批量写入在规则中被视为单独的请求,并且无法检查newData所做的所有写入的净效果实时数据库。我们期待将来将此添加到Cloud Firestore。

如果它有用,这个特定的用例也许可以在没有扇出的情况下解决,因为你可以进行usersRef.where('username', '==' 'foobar').get()查询以获得用户特定的用户名。