2017-10-06 1 views
3

Ich kann nicht herausfinden, wie man die '.validate'-Regel in Firestore korrekt einstellt. Grundsätzlich möchte ich ein User-Dokument ermöglichen nur die Felder enthalten Ich weiß:Firestore-Sicherheit - nur bekannte Felder zulassen

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

Ich möchte nicht irgendwelche anderen Bereichen außer dem 3 oben (Name, Telefon, Adresse).

Die Felder werden NICHT gleichzeitig gespeichert. Name und Telefon wird zuerst gespeichert, und Adresse wird nur gespeichert, wenn der Benutzer sein Profil bearbeiten möchte.

Ich habe die Regeln versucht, unten aber scheinen nicht zu funktionieren:

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

Dank.

Antwort

2

Sie können Ihre Regeln trennen unterschiedliche create und update (sowie delete) Logik enthalten:

// 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

Cool! Obwohl dies nicht so einfach ist wie meine vorherige Realtime Database-Regel, ist es die einzige, die diese Idee umsetzen konnte. Danke –

+0

Wie oben erwähnt, können Ihre RTDB-Regeln * dieses Verhalten nicht erreichen. –

+0

Wie setze ich die Sicherheitsregel für den Löschfeldwert? – Vishu

1

Sie suchen nach den Methoden size() und hasAll().

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

size() ermöglicht es Ihnen, eine genaue Anzahl von Bereichen zu gewährleisten. Kombinieren Sie das mit hasAll() ermöglicht es Ihnen, es auf diese spezifischen Felder zu sperren.

Sie können mehr in der Cloud Firestore Rules Referenzdokumente lesen.

+0

Hey Dan, vielen Dank für die Antwort. Das hat nicht funktioniert, weil diese Felder NICHT gleichzeitig gespeichert werden. Name und Telefon werden zuerst gespeichert und die Adresse wird später gespeichert. Wenn ich versuche, nur die Adresse zu speichern, schlägt die Regel fehl. –

+0

Ich versuche im Grunde dieselbe Regel zu erreichen, wie ich in Echtzeit-Datenbank hatte: "name": { ".validate ": true}, "Telefon": {" .validate": true}, "Adresse": {".validate": true}, "$ other": {".validate": false} –

+0

Ich glaube nicht, dass diese Regeln das tun, was Sie von ihnen erwarten. Die RT DB unterscheidet nicht zwischen Updates von Löschvorgängen (sie sind alle Sets). Während Sie also erzwingen, dass Sie nur mehrere Eigenschaften schreiben können, sagen Sie nichts über die Reihenfolge aus, in der diese Eigenschaften aktualisiert werden . –

Verwandte Themen