Cloud Firestore セキュリティ ルールを設定する

Android、iOS、およびウェブ クライアント ライブラリ用の Cloud Firestore と Cloud Firestore セキュリティ ルールを使用すると、インフラストラクチャを管理したり、サーバー側の認証コードや承認コードを作成したりする必要がなくなるため、優れたユーザー エクスペリエンスの構築に集中できます。Firebase Authentication でユーザーを認証し、Cloud Firestore に格納されているデータにアクセスできるユーザーを決定するためのルールを設定します。

Firebase コンソールで Cloud Firestore セキュリティ ルールを設定してカスタマイズします。

Cloud Firestore セキュリティ ルールを設定する

Firebase コンソールまたは Firebase CLI のいずれかを使用して、最初の Cloud Firestore セキュリティ ルールのセットを作成してデプロイできます。

Firebase コンソールを使用する

最初のルールセットを設定してデプロイするには、Firebase コンソールの Cloud Firestore セクションにある [ルール] タブを開きます。

画面にはデフォルトのルールが入力されており、すべてのデータについて read および write アクセスが誰にも許可されていない状態になっています。

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

このルールに変更を加えて、全員にアクセスを許可したり、開発中やプロトタイプ中に特定のユーザーセットにアクセスを許可したりできます。アプリケーションを公開する前に、Firebase Authentication を設定してルールを評価し、アプリケーションに必要な最高レベルのセキュリティを確保しましょう。

Firebase CLI を使用する

Firebase CLI を使用してルールをデプロイすることもできます。最初に、プロジェクト ディレクトリで firebase init firestore を実行します。設定中に、前述のルールが含まれているデフォルトのルールファイル(.rules)が Firebase CLI により生成されます。ルールを編集し、firebase deploy を実行してルールをデプロイします。ルールのみをデプロイする場合は、--only firestore:rules フラグを追加します。

Firebase CLI を使用する場合は、Firebase コンソールでのルールの編集内容がローカルマシンに反映されません。Firebase コンソールで編集を行う場合は、必ずローカル ルールファイルを更新してください。

Cloud Firestore セキュリティ ルールを編集する

ルールをカスタマイズする前に、ルールの仕組みを見てみましょう。ルールの match パスは、Cloud Firestore のドキュメントまたはコレクションを表しています。ルールは、match を使用して 1 つ以上のパスと照合でき(たとえば、1 つのルールがコレクション内のすべてのドキュメントと一致するなど)、1つの request 内で複数のルールの match が同じドキュメント名と一致することもあります。

複数のルールが特定のドキュメントと一致した場合、Cloud Firestore は、いずれかのルールで許可されていればオペレーションを許可します。たとえば、あるルールでユーザーに対してドキュメントへの書き込みアクセスが許可されていても、他のルールではそのユーザーに対して読み取りアクセスのみが許可されている場合、Cloud Firestore ではユーザーに対してそのドキュメントへの書き込が許可されます。

基本のルールタイプは allow ルールです。これは、オプションで指定されている条件を満たす場合に read オペレーションと write オペレーションを許可します。

複数のドキュメントまたはコレクションにルールを適用するにはワイルドカードを使用します。ワイルドカードでは文字列を中括弧で囲み、match パス内のドキュメントまたはコレクションの ID を表します。パス内のすべてのドキュメントおよびサブコレクションにワイルドカードを適用するには、ワイルドカード文字列の末尾に =** を追加します。詳細については、ルールでのワイルドカードの使用をご覧ください。

service cloud.firestore {
  match /databases/{database}/documents {
    // Rules match specific paths, matching a particular document within a collection
    match /myCollection/myDocument {
      allow read, write: if <condition>;
    }

    // Rules can also specify a wildcard, matching any document within a collection
    match /myCollection/{anyDocument} {
      allow write: if <other_condition>;
    }
  
  }
}

ルール評価のコンテキストも request オブジェクトと resource オブジェクトを使って示されます。request オブジェクトには、認証されたユーザー(request.auth)やリクエストが行われた時刻(request.time)など、リクエストに関する情報が含まれています。resource オブジェクトは Cloud Firestore ドキュメントです。

service cloud.firestore {
  match /databases/{database}/documents {
    // Rules can specify conditions that consider the request context
    // Such as user authentication or time of the request
    match /myCollection/myDocument {
      allow read: if request.auth != null;
    }

    // Rules can also consider fields of the resource being read or written
    match /myCollection/myDocument {
      allow read: if resource.data.field == value;
    }

    // Rules can also consider the contents of other documents stored
    // This can be used to enforce schema and referential integrity
    match /myCollection/myDocument {
      allow read: get(/myCollection/otherDocument).data.field == value;
    }

  }
}

次の例に示す単純なチャットアプリを見てみましょう。最初のルールでは、ユーザーに固有のデータに対する特定のユーザーのアクセスを制限します。2 番目のルールでは、すべてのユーザーのチャットルーム内のすべてのメッセージへのアクセスを許可します。

service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId} {
      allow read, write: if request.auth.uid == userId;
    }
    match /rooms/{roomId} {
      match /messages/{messageId} {
        allow read, write: if request.auth != null;
      }
    }
  }
}

ルールの例

次に、さまざまなアクセス制御を行う一般的なルールの例を示します。

公開

// Anyone can read or write to the database, even non-users of your app.
service cloud.firestore {
  match /databases/{database}/documents {
    // Match all documents, recursively, with a wildcard and the "=**" recursive modifier
    match /{document=**} {
      allow read, write;
    }
  }
}

ユーザー

// Grants a user access to a document matching their Auth user Id
service cloud.firestore {
  match /databases/{database}/documents {
    // Collection named "users", document named after the userId
    match /users/{userId} {
      allow read, write: if request.auth.uid == userId;
    }
  }
}

非公開

// Access to documents through the Cloud Firestore mobile/web
// client libraries is completely disallowed. Documents may still be
// accessible through the Cloud Firestore server client libraries;
// the Cloud Firestore REST and RPC APIs; and the Cloud Datastore
// client libraries and APIs.
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

次のステップ

詳細については、ニーズに合わせてルールをカスタマイズする方法をご覧ください。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。