最初に雲Firestoreのセキュリティルールを取る
13738 ワード
こんにちは!
私は現在、小さなPOCプロジェクトに取り組んでいます、そして、私はFirebaseが速いプロトタイピングの良い候補であると思いました.私はクラウドFirestoreと認証を使用しています.
このポストでは、私がFirestore規則について学んだことをあなたに示したいです.うまくいけば、それは役に立つでしょう.掘りましょう.
FireStoreスキーマの最初のバージョンは次のようになります.
もちろん、クラブは入れ子になったFirestoreコレクションです.このコレクションのキーは、FireBase認証モジュールからのユーザーIDです.今のメンバーは名前だけ.
上記のコレクションスキーマについては、次の規則を作成しました
最後の2つの規則では、以下のように定義されているヘルパー関数を使いました.
重要な注意:この関数は、DBの呼び出しの数に向かってカウントされ、請求に影響を与えます.
これは私がファイヤーストア規則との最初の出会いについて来たものです.それは完璧ではないが、それは良いスタートです.
現時点で私は
あなたがこの構造がどのように改善されることができるかについてのどんなコメントまたは提案があるならば、コメントで私に知らせさせてください.
ハッピーコーディング!🙂
追加のリソース
https://firebase.google.com/docs/rules
https://firebase.google.com/docs/firestore/security/rules-query
私は現在、小さなPOCプロジェクトに取り組んでいます、そして、私はFirebaseが速いプロトタイピングの良い候補であると思いました.私はクラウドFirestoreと認証を使用しています.
このポストでは、私がFirestore規則について学んだことをあなたに示したいです.うまくいけば、それは役に立つでしょう.掘りましょう.
FireStoreスキーマの最初のバージョンは次のようになります.
{
"clubs": {
"<clubId>": {
"name": "This is a public club",
"ownerId": "<ownerId>",
"visibility": "public",
"members": {
"<userId>": {
"name": "My fancy nickname"
}
}
}
}
}
トップレベルではクラブのコレクションです.各クラブの名前、所有者があり、それは公共または民間のいずれかすることができます.もちろん、クラブは入れ子になったFirestoreコレクションです.このコレクションのキーは、FireBase認証モジュールからのユーザーIDです.今のメンバーは名前だけ.
上記のコレクションスキーマについては、次の規則を作成しました
rules_version = '2';
service cloud.firestore {
match /clubs/{club} {
allow create: if request.resource.data.ownerId == request.auth.uid
allow delete, update: if request.auth != null && request.auth.uid == resource.data.ownerId
allow read: if request.auth != null && (resource.data.visibility == 'public' || isClubMember(club, request.auth.uid))
match /members/{member} {
allow read, write: if isClubOwner(club, request.auth.uid)
}
}
function isClubMember(clubId, userId) {
return exists(/databases/$(database)/documents/clubs/$(clubId)/members/$(userId));
}
function isClubOwner(clubId, userId) {
let club = get(/databases/$(database)/documents/clubs/$(clubId));
return club != null && club.data.ownerId == userId;
}
}
}
一つずつ見てみましょう. match /clubs/{club} {
このブロック内のすべてのルールは、club
変数の下で利用可能なIDを持つクラブを参照します.allow create: if request.resource.data.ownerId == request.auth.uid
クラブのオーナーとして自分自身を設定する限り、誰もがクラブを作成することができます.allow delete, update: if request.auth != null && request.auth.uid == resource.data.ownerId
のみ所有者が削除したり、クラブを更新します.allow read: if request.auth != null && (resource.data.visibility == 'public' || isClubMember(club, request.auth.uid))
任意の認証ユーザーは、パブリッククラブを見ることができます.非公開クラブはメンバーに見られる.match /members/{member} {
allow read, write: if isClubOwner(club, request.auth.uid)
}
のみ所有者が表示またはクラブのメンバーを変更することができます.最後の2つの規則では、以下のように定義されているヘルパー関数を使いました.
function isClubMember(clubId, userId) {
return exists(/databases/$(database)/documents/clubs/$(clubId)/members/$(userId));
}
この関数は、指定したクラブのメンバーコレクションを調べ、ユーザーが所属しているかどうかを確認します.重要な注意:この関数は、DBの呼び出しの数に向かってカウントされ、請求に影響を与えます.
function isClubOwner(clubId, userId) {
let club = get(/databases/$(database)/documents/clubs/$(clubId));
return club != null && club.data.ownerId == userId;
}
この関数はget
の代わりにexists
を使用し、指定されたユーザーが所有者かどうかを確認します.これは私がファイヤーストア規則との最初の出会いについて来たものです.それは完璧ではないが、それは良いスタートです.
現時点で私は
ownerId
を維持するのに最適な場所は何かわからない.現在のクラブを見ることができるすべてのユーザーを設定すると、所有者のIDを参照することができますし、それは完璧から遠くです.あなたがこの構造がどのように改善されることができるかについてのどんなコメントまたは提案があるならば、コメントで私に知らせさせてください.
ハッピーコーディング!🙂
追加のリソース
https://firebase.google.com/docs/rules
https://firebase.google.com/docs/firestore/security/rules-query
Reference
この問題について(最初に雲Firestoreのセキュリティルールを取る), 我々は、より多くの情報をここで見つけました https://dev.to/climbing_dev/first-take-on-cloud-firestore-security-rules-1b99テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol