Firestore规则,用于限制对文档中特定字段的写入权限

时间:2018-01-18 05:42:52

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

我正在使用Stripe进行付款。为此,我在Firestore中有以下数据模型:

Users/{userId}/payments/{document}

每个{document}都是一个看起来像的对象:

{
  amount: 55
  token: {...}
  charge: {...}
}

用户必须能够编写token字段(这是传递给服务器的字段),但我不希望用户能够编写charge字段。

目前我的规则允许任何用户阅读和写入此文档:

match /payments/{documents} {
  allow read, write: if request.auth.uid == userId;
}

什么Firestore规则将达到我想要的安全性?

4 个答案:

答案 0 :(得分:16)

我相信下面的内容可行,它允许客户更新除收费之外的字段,以及创建没有收费字段的文件。

<uses-permission android:name="android.permission.ACCESS_SUPERUSER">
</permission>

答案 1 :(得分:5)

Set type和其他一些很酷的东西宣布了。


使用Sets来确保文档仅包含字段“ a”,“ b”和“ c”:

request.resource.data.keys().toSet() == ["a", "b", "c"].toSet()

类似地,您可以确保文档仅具有指定的键,而没有其他键:

(request.resource.data.keys().toSet() - ["required","and","opt","keys"].toSet()).size == 0?`

答案 2 :(得分:3)

接受的答案不适用于update,其中request.resource.data返回一个已经与现有数据合并的新地图。因此,request.resource.data.keys().hasAll([<<field>>])总是返回true

无论如何,对我有用的是使用.diff()

function meta_is_modified() {
      return 'meta' in resource.data.diff(request.resource.data).affectedKeys();
    }

这是另一个具有多个受保护字段的版本:

function invalid_modification() {
  return resource.data.diff(request.resource.data).affectedKeys().hasAny(['field1', 'field2'].toSet());
}

答案 3 :(得分:1)

感谢重定向到设置类型,这很有帮助。 在我的项目中,我必须使用任何授权密钥(一个,多个或全部)来验证请求,但不要使用额外的密钥。

这是我所做的;也许可以帮忙:

(request.resource.data.keys().toSet().intersection(
    ["a","b","c","d"].toSet()
)).size() == request.resource.data.keys().toSet().size();

基本上,我比较了集合和请求集密钥与包含授权密钥的集合之间的交集。由于我希望所有请求字段都与这些键匹配,因此主集和交集必须相等。