2017-10-06 8 views
3

Firestoreで '.validate'ルールを正しく設定する方法がわかりません。 は基本的に、私は私が知っているのみフィールドが含まれるようにユーザー文書を許可する:Firestore Security - 既知のフィールドのみを許可する

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のルール* cant *はこの動作を達成します。 –

+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

私は基本的にリアルタイムデータベースと同じルールを達成しようとしています: "name":{".validate":true}、 "phone":{"validate":true}、 "address": {"validate":true} "$ other":{"validate":false} –

+0

私はこれらのルールがあなたが期待することをするとは信じていません。 RTデータベースは、作成からの更新を削除から区別しません(すべてのセットです)。そのため、いくつかのプロパティのみを書き込むことができますが、そのプロパティが更新される順序については何も言わない。 –

関連する問題