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

テスト結果

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

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

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

後編へつづく!

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

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

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

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

(株)ライトコードは、WEB・アプリ・ゲーム開発に強い、「好きを仕事にするエンジニア集団」です。
システム開発依頼・お見積もりはこちらまでお願いします。
また、技術が大好きなエンジニアを積極採用中です!詳しくはこちらをご覧ください。

※現在、多数のお問合せを頂いており、返信に、多少お時間を頂く場合がございます。

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

後編の記事はこちら!

ライトコードよりお知らせ

にゃんこ師匠にゃんこ師匠
システム開発のご相談やご依頼はこちら
ミツオカミツオカ
ライトコードの採用募集はこちら
にゃんこ師匠にゃんこ師匠
社長と一杯飲みながらお話してみたい方はこちら
ミツオカミツオカ
フリーランスエンジニア様の募集はこちら
にゃんこ師匠にゃんこ師匠
その他、お問い合わせはこちら
ミツオカミツオカ
   
お気軽にお問い合わせください!せっかくなので、別の記事もぜひ読んでいって下さいね!

一緒に働いてくれる仲間を募集しております!

ライトコードでは、仲間を募集しております!

当社のモットーは「好きなことを仕事にするエンジニア集団」「エンジニアによるエンジニアのための会社」。エンジニアであるあなたの「やってみたいこと」を全力で応援する会社です。

また、ライトコードは現在、急成長中!だからこそ、あなたにお任せしたいやりがいのあるお仕事は沢山あります。「コアメンバー」として活躍してくれる、あなたからのご応募をお待ちしております!

なお、ご応募の前に、「話しだけ聞いてみたい」「社内の雰囲気を知りたい」という方はこちらをご覧ください。

ライトコードでは一緒に働いていただける方を募集しております!

採用情報はこちら

書いた人はこんな人

ライトコードメディア編集部
ライトコードメディア編集部
「好きなことを仕事にするエンジニア集団」の(株)ライトコードのメディア編集部が書いている記事です。

関連記事