1. HOME
  2. ブログ
  3. IT技術
  4. テスト駆動で学ぶ Firestore セキュリティルール【カスタム関数編:第4回】

テスト駆動で学ぶ Firestore セキュリティルール【カスタム関数編:第4回】

【第4回】テスト駆動で成績データコレクションのルールを実装する

前回の記事では、成績コレクション records のデータ更新ルールを実装しつつ、ルールの見通しをよくするため、カスタム関数を使ってルールを整理してみました。

今回は、成績コレクション records のデータ取得・削除用ルールの実装を進めていきます。

データ取得・削除用ルールの作成後、最後に、これまでに作成した全てのテストを実行して、作成したセキュリティルールが第1回に設定した要件に沿ったルールとなっているかを確認します。

前回の記事はこちら

前回の記事は、以下をご参照ください。

Firestore 上のデータ取得ルールの実装について

テストの作成

ここまでの実装と同様に、まずは、データ取得の要件を再確認します。

  1. admin ユーザはデータの取得可

teacher ユーザの取得要件

  1. 担任でないデータは取得不可

student ユーザの取得要件

  1. 自分以外のデータは取得不可
  2. 対象シーズンが成績評価期間の場合は取得不可

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

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

テストのコード

テストの概要

各テストで共通の内容

テストごとに、テスト対象となるロールユーザで認証されたクライアントを取得しています。

teacher ユーザの取得要件のテスト

担任でないデータは取得不可 となるテストでは、データ取得前に、データベース上のデータの担任フィールドを、リクエストデータの担任とは異なる担任に変更

student ユーザの取得要件のテスト

要件にあったデータの取得に成功 となるテストと、 自分以外のデータは取得不可 となるテストでは、データベース上のデータの成績評価期間フラグを「false」に変更して、成績評価期間外に設定しています。

Firestore 上のデータ取得ルールを実装してみる

それでは、作成したテストに沿って、セキュリティルールを実装していきましょう。

全ての read アクセスを許可するルールを設定

データ更新ルールの実装のときと同じように、今回もまず、データ取得に関するルールだけを実装し、最後に、作成した全てのルールと統合したいと思います。

まずは、 records コレクションの read アクセスを全て許可し、「要件にあったデータの追加に成功」するテストだけを通します

以下のように、セキュリティルールを調整してください。

テストをスタート

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

テスト結果

adminユーザはデータの取得可 となるテストと、teacher ユーザ、student ユーザの 要件にあったデータの取得に成功 するテストが成功しました。

これまで同様に、失敗したテストを順次、通していきます。

「ログインしていないユーザは取得不可」となるルールを設定

ログインしていないユーザは取得不可 となるよう、以下のようにルールを調整してください。

テスト結果

ログインしていないユーザは取得不可 となるテストが通りました。

認証チェックをロールごとに分割

ここで、admin、teacher、student ユーザ、それぞれのアクセス許可条件を個別に設定するため、認証チェックをロールごとに分割します。

以下のように、セキュリティルールを調整してください。

データ追加・更新ルールの実装で定義した isAdmin()isTeacher() 関数と同様、 student ロールのチェック関数 isStudent() を定義しています。

ここまでに定義した、ロールチェック用のカスタム関数を使って、認証チェックをロールごとに分割しています。

ルールの調整による影響がないか確認するため、テスト結果を確認しておきます。

テスト結果

テスト結果に変化はないので、続いて teacherユーザの取得要件 テストを通していきます。

「担任でないデータは取得不可」となるルールを設定

担任でないデータは取得不可 となるように、セキュリティルールを以下のように調整してください。

ここで、teacher ユーザに対する許可条件に、更新ルールの実装時に定義した isHomeroomTeacher() 関数を追加して、担任チェックを行っています。

テスト結果

teacherユーザの取得要件 テストが全て通りました。

student ユーザの取得要件をルールに設定

続いて、 studentユーザの取得要件 テストを通していきます。

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

ここで、student ユーザの許可条件に、本人データチェック関数 isSelfData() と、データ更新ルールの実装時に定義した成績評価期間チェック関数 isEvaluationPeriod() を追加しています。

isSelfData() 関数では、リクエストユーザと「match ステートメント」中の studentId 変数が一致するかをチェックし、リクエストユーザ本人のデータかどうかを確認しています。

成績評価期間のチェックでは、 isEvaluationPeriod() に論理否定演算子「 !」を添えて、評価期間外の取得を許可しています。

テスト結果

全てのテストが通りました!

以上で、データ取得用のルールは実装完了です。

次のテストとの競合を避けるため、テストを終了してください。

Firestore 上のデータ削除ルールの実装について

テストの作成

次に、データ削除ルールを実装します。

ここまでのルール実装と同様、テストを作成する前に、まずはデータ削除の要件を再確認します。

  1. admin ユーザ以外は削除不可

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

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

テストのコード

テストの概要

認証されていないユーザ、teacher ユーザ、student ユーザのそれぞれについて、データの削除不可テストを行います。

admin ユーザについては、要件に沿って削除が成功するかどうかをチェックします。

Firestore 上のデータ削除ルールを実装してみる

続いて、作成したテストに沿って、セキュリティルールを実装していきます。

ここまでのルール実装と同様、データ削除に関する部分だけを実装し、その後、これまでに作成したルールと統合します。

全ての delete アクセスを許可するルールを設定

削除ルールについては、簡単にルールを調整する程度なので、最初にルールを作成し、続いて、テストをパスするかを簡単に確認します。

以下のように、セキュリティルールを調整してください。

データ追加ルールの実装で定義した isAdmin() 関数を使って、admin ユーザのみデータの削除を許可しています。

テストをスタート

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

テスト結果

全てのテストが通りましたので、以上でデータ削除用のルールは実装完了です。

リグレッションテスト

最後に、これまでの記事で実装したルールを統合し、全てのテストを再度実行します。

テストにより、ルールの調整を進める中で「ルールが要件から外れていないか?」確認します。

前回までに実装したルールへ、今回作成したデータの取得・削除ルールを統合すると以下のようになります。

全てのルールを統合してテストを再実行

全てのテストを実行

以下のコマンドを実行して、ここまでに追加した全てのテストを実行してください。

テスト結果

全てのテストに成功しました。以上で、最初に設定した要件に沿ったルールを実装することができました。

まとめ

以上、成績評価システムを例に、成績コレクションのルールを実装すると共に、セキュリティルールでのカスタム関数の利用について解説してみました。

最後に、今回の内容を簡単にまとめてみたいと思います。

  1. カスタム関数で条件に名前付け!
  2. カスタム関数で重複回避!
  3. カスタム関数で条件が再利用できる!
  4. カスタム関数でセキュリティルールがスッキリ!
  5. 締めのリグレッションテスト!

これにて、『カスタム関数編』は終了となります!

4回にわたり、ご愛読いただきありがとうございます!

次回の「テスト駆動で学ぶ Firestore セキュリティルール」の連載にもご期待ください!

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

データ検証編はこちら

「データ検証編」では、リクエストデータ、データベース上のデータの参照などについて解説

データ比較編はこちら

「データ比較編」では、データの比較や型チェックなどについて解説

カスタム関数編はこちら

「カスタム関数編」では、「比較編」で作成したルールをもとに、カスタム関数の使い方を解説

書いた人はこんな人

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

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

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

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

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

関連記事

採用情報

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

バックエンドエンジニア

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

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

\ 世界を変える…! /

Androidエンジニア

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

iOSエンジニア