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"]
手伝ってくれてありがとう。
ルールを分離して、異なる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;
size()
メソッドとhasOnly()
メソッドの両方を探しています。
_allow write: if request.resource.data.size() == 3
&& request.resource.data.keys().hasOnly(['name', 'phone', 'address'])
_
size()
を使用すると、正確な数のフィールドを確保できます。これをhasOnly()
と組み合わせると、特定のフィールドにロックできます。
詳細については、 Cloud Firestore Rules リファレンスドキュメントをご覧ください。
マイクマクドナルドの回答に追加して、特定のキーを確認するには、フォームは次のようになります。
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