2017-10-06 67 views
3

我无法弄清楚如何在Firestore中正确设置'.validate'规则。 基本上,我想允许用户文档包含我知道的字段:Firestore安全 - 只允许已知字段

user { 
name: "John" 
phone: "2342222" 
address: "5th Avenue" 
} 

我不想再说了上述3个其他任何字段(姓名,电话,地址)。

这些字段不会同时保存。 名称电话将首先保存,并且地址仅在用户想要编辑他的配置文件时才被保存。

我试过下面的规则,但似乎并没有工作:

allow read: if request.auth.uid == uid; 
allow write: if request.auth.uid == uid && 
request.resource.data.keys() in ["name", "phone", "address"] 

感谢您的帮助。

回答

2

可以分开你的规则,包括不同createupdate(以及delete)逻辑:

// allows for creation with name and phone fields 
allow create: if request.resource.data.size() == 2 
       && request.resource.data.hasAll(['name', 'phone']) 
       && request.resource.data.name is string 
       && request.resource.data.phone is string; 
// allows a single update adding the address field 
// OR (||) in additional constraints 
allow update: if request.resource.data.size() == resource.data.size() + 1 
       && !('address' in resource.data) 
       && request.resource.data.address is string; 
+0

很酷!虽然这不像我以前的Realtime Database规则那么简单,但它是唯一能够完成这个想法的人。谢谢 –

+0

如上所述,您的RTDB规则*无法完成此行为。 –

+0

如何设置删除字段值的安全规则? – Vishu

1

您正在寻找size()hasAll()方法。

allow write: if request.resource.data.size() == 3 
      && request.resource.data.hasAll(['name', 'phone', 'address']) 

使用size()可以确保确切数量的字段。将它与hasAll()结合,可以将其锁定到这些特定字段。

您可以在Cloud Firestore Rules参考文档中阅读更多内容。

+0

嗨丹,感谢您的答复。这是行不通的,因为这些字段不会同时保存。姓名和电话将首先保存,地址将在以后保存。所以,当我试图只保存'地址'时,规则就会失败。 –

+0

我基本上试图完成与我在Realtime Database中相同的规则: “name”:{“.validate”:true}, “phone”:{“.validate”:true}, “address”: {“.validate”:true}, “$ other”:{“.validate”:false} –

+0

我不相信这些规则会做你期望的事情。 实时数据库不会区分创建和删除更新(它们都是集合),因此,当您强制执行该操作时,只能编写多个属性,而没有说明这些属性的更新顺序。 –