2017-10-06 79 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

我不相信這些規則會做你期望的事情。 實時數據庫不會區分創建和刪除更新(它們都是集合),因此,當您強制執行該操作時,只能編寫多個屬性,而沒有說明這些屬性的更新順序。 –