1. HOME
  2. ブログ
  3. IT技術
  4. テスト駆動で学ぶ Firestore セキュリティルール 【データ検証編 / 前編】

テスト駆動で学ぶ Firestore セキュリティルール 【データ検証編 / 前編】

テスト駆動で商品データのルールを実装する

この記事では、セキュリティルールによるデータ検証について、商品データのルールを例に解説していきます。

前編・後編の二回に分け、テスト駆動で商品データのルールの実装を進めます。

条件設定で使用できるデータなどについても解説していたいと思います!

簡単な流れ

以下のような流れで解説を進めていきます。

前編

  1. 商品データコレクションの要件を設定
  2. テスト環境の準備
  3. テストデータ用のクラスを作成
  4. データ追加ルールを実装・解説

後編

  1. データ更新ルールを実装・解説
  2. データ取得ルールを実装・解説
  3. 全体テストで要件の最終チェック
  4. まとめ

今回は、前編パートの、「実装目標(要件)の設定からデータ追加ルールの実装まで」を解説していきます。

実装目標

商品データコレクション items を想定して、以下の要件を目標に実装を進めていきます。

商品データ追加の要件

  1. データ追加をリクエストしたユーザが商品管理者と一致しない場合は追加不可

商品データ更新の要件

  1. データ更新をリクエストしたユーザが商品管理者と一致しない場合は追加不可
  2. 商品管理者の変更不可
  3. ロックされたデータの更新不可
  4. 商品名の変更不可

商品データ取得の要件

  1. 認証されていないユーザはデータ取得不可
  2. 売り切れ商品のデータ取得不可

前準備 ~ テスト環境の準備 ~

初めに、テスト環境を準備します。

テスト環境のセットアップ

以下のコマンドを実行して、テスト環境をセットアップします。

上記のリポジトリに、この記事のコードがまとめてあります。

npm パッケージのインストール

以下のコマンドを実行して、npm パッケージをインストールしてください。

Firebase CLI ツールのインストール

まだ、Firebase CLI ツールをインストールしていない場合は、以下のコマンドを実行してインストールします。

Firestore エミュレータを起動

以下のコマンドを実行して、Firestore エミュレータを起動してください。

以上で、テスト環境の準備は完了です。

コードを確認したい場合は、以下のコマンドより、コーディング済みのタグを指定してチェックアウトしてください。

テスト環境のセットアップの解説

テスト環境のセットアップについて、より詳細な内容は、以下の記事をご参照ください。

前準備 ~ テストデータクラス ~

テストを作成する前に、まず、テストデータ用のクラスを作成します。

tests/TestData.ts ファイルを作成して、以下の内容を記述してください。

テストデータクラスのコード

テストデータクラスの概要

getInitialData()

初期データの取得メソッド

初期データの追加テストや、データの更新・取得テストの初期データの準備に使用します。

getValidUpdateData()

要件にあった更新データの取得メソッド

データ更新テストに使用します。

商品データ追加ルールの実装

テスト作成の前に、データ追加の要件を再確認します。

  1. データ追加をリクエストしたユーザが商品管理者と一致しない場合は追加不可

上記の要件に沿って、テストを作成します。

tests/data.add.test.ts ファイルを追加して、以下のようにコードを記述してください。

テストのコード

テストの概要

コードの冒頭

Firestore エミュレータのホスト指定をし、作成したテストデータクラスの読み込みを行っています。

デフォルトポートでエミュレータを起動している場合は、ホスト指定は必要ありません。

ですが、今回は 58080 ポートでエミュレータを起動しているので、ホストを 58080 ポートで指定しています。

「データ追加をリクエストしたユーザが商品管理者と一致しない場合は追加不可」テスト

const db = supporter.getFirestoreWithAuth("other_user"); の部分で、商品管理者 admin_user とは異なるユーザ  other_user で認証された Firestore クライアントを取得しています。

ルールの実装

商品データ追加用のテストが完成したので、テスト駆動でセキュリティルールの実装を進めていきます。

テスト駆動のスタイルに従い、まずはテストを実施してみて、テストが失敗することを確認します。

テストをスタート

以下のコマンドを実行し、テストをスタートしてください。

テスト結果

各テストの結果に、以下のようなエラーメッセージが表示されて、テストが失敗します。

全アクセスを拒否するセキュリティルールを設定

tests/firestore.rules ファイルがないという事なので、 tests/firestore.rules ファイルを追加して、以下のように記述してください。

まずは、全てのアクセスを拒否するとこらからスタートし、上から順にテストを通して行きます

テスト結果

テストが自動で再実施され、テスト結果の冒頭に以下のような結果が表示されます。

テスト駆動開発では、失敗するテストを順次追加していくのが一般的です。

しかし、この記事では、解説のわかりやすさのため、テストをまとめて追加しています。

そのため、一部テストが通ってしまっていますが、とりあえずスルーしてください。

items コレクションへの全アクセスを許可するセキュリティルールを設定

「要件にあったデータの追加に成功」テストが失敗しているので、とりあえず items コレクションへのアクセスを全て許可してみます。

以下のようにコードを調整してください。

テスト結果

テスト結果は、以下の通りになります。

「要件にあったデータの追加に成功」テストが成功しました。

次に、「データ追加をリクエストしたユーザが商品管理者と一致しない場合は追加不可」テストを通します。

ユーザ情報を許可条件の設定に使用する

以下のようにルールを調整してください。

ここで、 request.auth フィールドにより、リクエストしたユーザの情報を、許可条件の設定に使用することができます

uid のほか、 email や  phone_number などを参照できます。

また、 request.resource.data フィールドにより、追加データの情報を条件に使用することができます

なお、 request.auth のより詳しい内容は、以下を参照してください。

【参考】
Interface: Request | Firebase - auth

テスト結果

テスト結果は、以下の通りとなります。

テストが全て通りましたので、商品データ追加向けのセキュリティルールの実装はこれで完了です。

次のテストとの競合を避けるために、データ追加用のテストを終了してください。

後編へつづく!

以上、「実装目標の設定」から、「データ追加ルールを実装する」ところまで解説してみました。

後編では、データ更新と取得のルールを、今回と同じように、テスト駆動で実装していきます

また、データベースにすでにあるデータの利用などについても解説していきます。

それでは、続きは後編で!

こちらの記事もオススメ!

後編の記事はこちら!

書いた人はこんな人

広告メディア事業部
広告メディア事業部
「好きを仕事にするエンジニア集団」の(株)ライトコードです!

ライトコードは、福岡、東京、大阪の3拠点で事業展開するIT企業です。
現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。
いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。

システム開発依頼・お見積もり大歓迎!

また、現在「WEBエンジニア」「モバイルエンジニア」「営業」「WEBデザイナー」「WEBディレクター」を積極採用中です!
インターンや新卒採用も行っております。

以下よりご応募をお待ちしております!
https://rightcode.co.jp/recruit

関連記事

採用情報

\ あの有名サービスに参画!? /

バックエンドエンジニア

\ クリエイティブの最前線 /

フロントエンドエンジニア

\ 世界を変える…! /

Androidエンジニア

\ みんなが使うアプリを創る /

iOSエンジニア