web-dev-qa-db-ja.com

Firestoreセキュリティ-既知のフィールドのみを許可する

Firestoreで「.validate」ルールを適切に設定する方法がわかりません。基本的に、ユーザードキュメントにのみ私が知っているフィールドを含めることを許可したいと思います。

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

上記の3つ以外のフィールド(名前、電話番号、住所)は必要ありません。

フィールドは同時に保存されません。 nameおよびphoneが最初に保存され、addressは、ユーザーが自分のプロファイルを編集する場合にのみ保存されます。

以下のルールを試しましたが、機能しないようです。

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

手伝ってくれてありがとう。

12
Fabio Berger

ルールを分離して、異なるcreateおよびupdate(および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;
12
Mike McDonald

size()メソッドとhasOnly()メソッドの両方を探しています。

_allow write: if request.resource.data.size() == 3 
             && request.resource.data.keys().hasOnly(['name', 'phone', 'address'])
_

size()を使用すると、正確な数のフィールドを確保できます。これをhasOnly()と組み合わせると、特定のフィールドにロックできます。

詳細については、 Cloud Firestore Rules リファレンスドキュメントをご覧ください。

5
Dan McGrath

マイクマクドナルドの回答に追加して、特定のキーを確認するには、フォームは次のようになります。

request.resource.data.keys().hasAll

の代わりに

request.resource.data.hasAll

完全な例:

// allows for creation with name and phone fields
allow create: if request.resource.data.size() == 2
              && request.resource.data.keys().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;

詳細はこちら: https://firebase.google.com/docs/reference/rules/rules.Map

3
Mufasa