我正在使用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规则将达到我想要的安全性?
答案 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();
基本上,我比较了集合和请求集密钥与包含授权密钥的集合之间的交集。由于我希望所有请求字段都与这些键匹配,因此主集和交集必须相等。