最初に雲Firestoreのセキュリティルールを取る


こんにちは!
私は現在、小さな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