阻止在Firestore

时间:2018-01-12 23:02:42

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

在Firestore中,我有一个包含多个文档的集合,其结构类似于

users: [
  1234: {
    foo: 'bar'
  }
]

在我们的应用程序的旧版本中(我们已修复,但仍有许多用户使用它),有一段代码正在执行

firestoreInstance.collection('users').doc(1234).set({});

因为一个旧的错误。

它覆盖了整个对象,所以它变成了

users: [
  1234: {
  }
]

我已尝试使用以下安全规则阻止此特定覆盖:

service cloud.firestore {

  match /databases/{database}/documents {
  function objectIsEmpty() {
    return request.resource.data.size() == 0;
  }

  match /users/{userId=**} {
    allow read;
    allow write: if !objectIsNotEmpty();
  }
}
}

但覆盖仍在发生。我尝试过同样的事情 allow write: if false;并没有帮助。

根据Customize Cloud Firestore Security Rules

  

Cloud Firestore中有三种写入操作:创建,更新和删除。这些对应于客户端库中的 set(),add(),update(),remove()和transaction()方法。为方便起见,写操作允许所有这些。

我想象不允许write使用空对象(通过禁止使用request.resource.data.size() == 0写入)不允许set({})代码被执行。

只有 update而不是set 的相同代码才会被恰当地阻止,并且不会覆盖该对象。

我的规则有问题吗?是否有另一种方法可以阻止任何使用空对象的写操作?

0 个答案:

没有答案