2020.2.26
2020.3.16

Cloud Firestoreのセキュリティルール設定例

Cloud Firestoreのセキュリティルールの書き方が特殊だったので、設定例をメモしておきます。

目次

  • セキュリティルールについて
  • テスト(開発)モード
  • ロックモード
  • 認証必須
  • 特定のコレクションの単一データの読み込みのみ許可
  • 特定のコレクションの追加のみ許可
  • 更新で特定のフィールドの変更のみ許可
  • ルールの判定でNGとなった場合
  • 参考リンク

セキュリティルールについて

Cloud Firestoreのルールとして指定可能なのは大きく分けて「read」と「write」の2つ。この内、readは「getlist」、writeは「createupdatedelete」で細かく指定することが可能です。

書き方が特殊で慣れるまで時間がかかるので、本番で設定する際は注意が必要です。

なお、セキュリティルールは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)

参考リンク

Firebase】関連記事