小编mdi*_*ker的帖子

使用 Firestore 安全规则限制在嵌套对象上写入的字段

tl;dr:我认为Set需要一种方法来获取元素 ( set.toList()[0]),但也许我错过了一些东西!


你好!我正在开发一个预算应用程序,使用 Firestore 和大量小对象(信用卡交易)。为了限制读取次数,将每个事务存储为单独的文档是没有意义的,因为用户可能一次需要数百个事务。

相反,我有一个容器来保存许多交易,如下所示:

/user/{user_id}/transactions/{container_id}

container: {
  transactions: {
    transaction_id_1: {
      amount: 8.25,
      note: 'chipotle lunch'
    },
    transaction_id_2: {
      amount: 12.01
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这很好用,但我认为安全规则不适用于写入。我希望允许用户修改某些字段 ( note),但不允许修改其他字段 ( amount)。如果每个事务都是一个文档,我们可以使用MapDiff来完成此操作,但嵌套使其变得更加困难。

由于我们无法编写 for 循环,因此如果我们将自己限制为每次写入一个更新的事务,那么使用嵌套的 MapDiff 应该完全可以实现这一点,如下所示:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents/{document=**} {

    function allowTransactionUpdate() {
      let transactionId = <transaction ID of the single transaction being updated>;

      // Limit fields updated for container.
      return request.resource.data.diff(resource.data).changedKeys()
        .hasOnly(['transactions']) &&

      // Make …
Run Code Online (Sandbox Code Playgroud)

firebase-security google-cloud-firestore

3
推荐指数
1
解决办法
875
查看次数