Cloud Firestoreのセキュリティルール設定例
Cloud Firestoreのセキュリティルールの書き方が特殊だったので、設定例をメモしておきます。
目次
- セキュリティルールについて
- テスト(開発)モード
- ロックモード
- 認証必須
- 特定のコレクションの単一データの読み込みのみ許可
- 特定のコレクションの追加のみ許可
- 更新で特定のフィールドの変更のみ許可
- ルールの判定でNGとなった場合
- 参考リンク
セキュリティルールについて
Cloud Firestoreのルールとして指定可能なのは大きく分けて「read」と「write」の2つ。この内、readは「get、list」、writeは「create、update、delete」で細かく指定することが可能です。
書き方が特殊で慣れるまで時間がかかるので、本番で設定する際は注意が必要です。
なお、セキュリティルールはFirebaseのコンソール上から直接修正することができ、設定したルールが意図した通りに動作するか確認するためのシミュレータも用意されています。
テスト(開発)モード
すべてのデータにして書き込みを許可する場合、ルールの設定は以下のようにします。
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if true;
}
}
}
ロックモード
逆にすべての書き込みを許可しないようにするには、先ほどのルールのreadとwriteを「false」に変えます。
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if false;
}
}
}
認証必須
認証必須にするには以下の通り。
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth.uid != null;
}
}
}
特定のコレクションの単一データの読み込みのみ許可
特定のコレクション(products)に対して、単一データの読み込みのみ許可する場合は以下の通りです。(全件の取得をさせたくない場合に使用)
service cloud.firestore {
match /databases/{database}/documents {
match /products/{productId} {
allow read: if productId != null;
}
}
}
ルールのデフォルトは「false」なので、指定しないものについては禁止となります。
特定のコレクションの追加のみ許可
特定のコレクション(products)に対してデータ(ドキュメント)の追加のみ許可する場合。(更新や削除はさせない)
service cloud.firestore {
match /databases/{database}/documents {
match /products/{product=**} {
allow create: if request.resource.data.size() == 3 &&
request.resource.data.name is string &&
request.resource.data.created_at is timestamp &&
request.resource.data.updated_at is timestamp;
}
}
}
上記の場合、登録するフィールドは「name」、「created_at」、「updated_at」の3つ。
「allow create: if ~」の部分で送信されたデータのチェック(フィールドの個数や型の判定)を行っています。
更新で特定のフィールドの変更のみ許可
更新時、特定のフィールドの変更しか許可しない場合。
service cloud.firestore {
match /databases/{database}/documents {
match /products/{productId} {
allow read: if productId != null;
allow update: if productId != null &&
request.resource.data.size() == 3 &&
request.resource.data.name == resource.data.name &&
request.resource.data.created_at == resource.data.created_at &&
request.resource.data.updated_at != resource.data.updated_at;
}
}
}
「request.resource.data」は変更後のデータ、「resource.data」は変更前のデータ。
上記の場合、「updated_at」以外の値が変わっていたらエラーとなります。
ルールの判定でNGとなった場合
FirebaseError: Missing or insufficient permissions というエラーが発生します。
FirebaseError: Missing or insufficient permissions.
at new Hr (https://www.gstatic.com/firebasejs/7.8.2/firebase-firestore.js:1:48219)
at https://www.gstatic.com/firebasejs/7.8.2/firebase-firestore.js:1:378673
at wr.<anonymous> (https://www.gstatic.com/firebasejs/7.8.2/firebase-firestore.js:1:377569)
at Wt (https://www.gstatic.com/firebasejs/7.8.2/firebase-firestore.js:1:15221)
at wr.S.dispatchEvent (https://www.gstatic.com/firebasejs/7.8.2/firebase-firestore.js:1:16063)
at Er.ua (https://www.gstatic.com/firebasejs/7.8.2/firebase-firestore.js:1:45322)
at nr.S.Fa (https://www.gstatic.com/firebasejs/7.8.2/firebase-firestore.js:1:43229)
at Ge (https://www.gstatic.com/firebasejs/7.8.2/firebase-firestore.js:1:21453)
at qe (https://www.gstatic.com/firebasejs/7.8.2/firebase-firestore.js:1:20854)
at Me.S.Ja (https://www.gstatic.com/firebasejs/7.8.2/firebase-firestore.js:1:23264)