Flutterアプリケーション開発概論

【本番用Rules】ログインユーザー・チームメンバー・権限ごとに制限する

46LINE風チームタスク管理アプリを作りながら、ログイン・データベース・権限管理を学ぶ
FlutteriOSAndroidMacOSWindows基礎から学ぶ開発アプリ開発

このページでやること

このページでは、学習中だけ使う「全開放ルール」を設定します。

これは、Firestoreの読み書きをすべて許可するルールです。

誰でも読める
誰でも書ける
誰でも削除できる

アプリ開発中に、まず動作確認を進めるために使います。

ただし、本番公開では絶対に使いません。


今日のゴール

Firebase Consoleで、開発用Rulesを設定できるようにします。

Firebase Consoleを開く
↓
Firestore Database
↓
Rules
↓
開発用Rulesを貼る
↓
Publish / 公開

npmや環境変数は必要?

このページでは、npmは使いません。

環境変数も設定しません。

Firebase Consoleをブラウザで操作するだけです。


このページで使う開発用Rules

先に、完成形を見ておきます。

rules_version = '2';

service cloud.firestore {
  match /databases/{database}/documents {

    match /{document=**} {
      allow read, write: if true;
    }

  }
}

意味はこうです。

read  → 読み取りOK
write → 作成・更新・削除OK
if true → 常に許可

重要:これは学習中だけ

このルールは、とても危険です。

本番公開では使いません。

学習中の動作確認 → OK
本番公開 → NG
クライアント案件 → NG
実ユーザーデータ → NG

このページでは、「まずアプリを動かすための一時的な設定」として使います。


Step 1:Firebase Consoleを開く

ブラウザでFirebase Consoleを開きます。

https://console.firebase.google.com/

ログイン画面が出た場合は、Firebaseプロジェクトを作ったGoogleアカウントでログインします。


Step 2:プロジェクトを選ぶ

今回のFlutterアプリで使っているFirebaseプロジェクトをクリックします。

Firebase Console
↓
今回のプロジェクト

プロジェクトが分からない場合は、Flutter側で確認します。

lib/firebase_options.dart

この中の projectId を見ます。

projectId: 'あなたのプロジェクトID',

Step 3:Firestore Databaseを開く

左側メニューから、Firestore Databaseを開きます。

Build
↓
Firestore Database

日本語表示の場合は、次のような名前です。

構築
↓
Firestore Database

Step 4:Rules画面を開く

Firestore Databaseの上の方にある Rules を開きます。

Firestore Database
↓
Rules

日本語表示の場合は、次のような名前です。

ルール

ここに、Firestoreのアクセスルールを書きます。


Step 5:今のRulesをコピーしておく

念のため、今書いてあるRulesをコピーしてメモしておきます。

今のRulesを選択
↓
コピー
↓
メモ帳やVS Codeに貼る

あとで戻したくなったときに使えます。


Step 6:開発用Rulesを貼り付ける

Rules画面に、次のコードを貼り付けます。

rules_version = '2';

service cloud.firestore {
  match /databases/{database}/documents {

    match /{document=**} {
      allow read, write: if true;
    }

  }
}

このルールは、Firestore内のすべてのデータに対して、読み書きを許可します。


Step 7:Publish / 公開する

貼り付けたら、右上または画面内のボタンを押します。

Publish

日本語表示の場合は、次のボタンです。

公開

これを押すと、ルールが反映されます。


Step 8:アプリで確認する

ターミナルでアプリを起動します。

flutter run

すでに起動している場合は、ターミナルで r を押します。

r

うまく反映されない場合は、R を押します。

R

Step 9:動作確認する項目

アプリで、次を確認します。

新規登録できる
ログインできる
チーム作成できる
チーム一覧が表示される
タスク作成できる
タスク編集できる
タスク削除できる
メンバー一覧が表示される
メンバー追加できる
権限変更できる

全開放ルールなので、Firestore Rulesが原因の permission-denied は基本的に出ません。


Step 10:permission-deniedが消えるか確認する

もし前のページで、次のエラーが出ていた場合です。

permission-denied

開発用Rulesにすると、エラーが消えるか確認できます。

エラーが消える
↓
Rulesが原因だった可能性が高い

逆に、エラーが消えない場合は、別の原因かもしれません。

teamIdが違う
uidが違う
コードの参照先が違う
Firebaseプロジェクトが違う

開発用Rulesの意味を理解する

match /{document=**}** とは?**

match /{document=**}

これは、Firestore内のすべてのドキュメントを対象にする書き方です。

users
teams
teams/{teamId}/members
teams/{teamId}/tasks

全部に当たります。


allow read, write** とは?**

allow read, write

これは、読み書きを許可するという意味です。

命令意味
read読み取り
write作成・更新・削除

write には、次が含まれます。

create
update
delete

if true** とは?**

if true

これは、常に許可という意味です。

条件なしでOK
誰でもOK
いつでもOK

だから危険です。


なぜ学習中は全開放にするのか

初心者の学習では、最初からRulesを厳しくすると、どこで詰まっているのか分かりにくくなります。

コードが間違っているのか
Firestoreの保存場所が違うのか
Rulesに止められているのか

原因が増えすぎます。

そのため、最初は全開放にして、アプリの基本機能を先に完成させます。

1. まず動かす
2. データ構造を確認する
3. 画面を完成させる
4. 最後にRulesを安全にする

この順番が分かりやすいです。


ただし、本番では使わない

全開放ルールは、実際のサービスでは危険です。

なぜなら、次のような状態になるからです。

他人のユーザー情報が読める
他人のチームを消せる
他人のタスクを編集できる
誰でもメンバーを追加できる
誰でも権限を変更できる

つまり、アプリの中身が守られていません。


本番用ではどうする?

本番用では、次のように制限します。

ログインしている人だけ読める
自分のusers情報だけ編集できる
チームメンバーだけチームを読める
owner/adminだけメンバー追加できる
ownerだけ権限変更できる
owner/adminだけタスク削除できる
viewerは見るだけ

これは、次のページ以降で少しずつ作ります。


学習中のおすすめ運用

開発中は、次のように使い分けると分かりやすいです。

状況Rules
画面やFirestore保存を作っている全開放Rules
権限制御をテストしているログイン必須Rules
本番前の確認本番用Rules
実ユーザーに公開本番用Rulesのみ

このページの全開放Rulesは、一番上の「画面やFirestore保存を作っている」段階だけです。


Firebase Consoleに警告が出る場合

Firebase Consoleで、次のような警告が出ることがあります。

Your security rules are defined as public

意味はこうです。

あなたのRulesは公開状態で危険です

開発中であれば、内容を理解した上で進めます。

本番公開前には、必ず安全なRulesに戻します。


よくあるエラーと直し方

エラー原因直し方
Rulesが保存できない{}; が間違っているコードをそのまま貼り直す
Publishできない構文エラーがあるエラー行を確認する
permission-deniedが消えない別のFirebaseプロジェクトを見ているfirebase_options.dartprojectId を確認
アプリに反映されない公開していないPublish / 公開 を押す
データが表示されないRules以外が原因Firestoreの保存場所を確認
警告が出る全開放なので危険という警告学習中だけ使う。本番では戻す

Rulesを間違えたときに戻す方法

うまく動かない場合は、まず次の開発用Rulesに戻します。

rules_version = '2';

service cloud.firestore {
  match /databases/{database}/documents {

    match /{document=**} {
      allow read, write: if true;
    }

  }
}

それでも動かない場合は、Rules以外を確認します。

Firebaseプロジェクトが合っているか
Firestoreにデータがあるか
collection名が合っているか
teamIdが合っているか
uidが合っているか

最短作業まとめ

読むのが大変な人は、ここだけ見てください。

1. Firebase Consoleを開く

https://console.firebase.google.com/

2. Rules画面を開く

Build
↓
Firestore Database
↓
Rules

3. このRulesを貼る

rules_version = '2';

service cloud.firestore {
  match /databases/{database}/documents {

    match /{document=**} {
      allow read, write: if true;
    }

  }
}

4. 公開する

Publish / 公開

5. アプリで確認する

flutter run

チェックリスト

□ Firebase Consoleを開いた
□ 今回のプロジェクトを選んだ
□ Firestore Databaseを開いた
□ Rulesを開いた
□ 今のRulesをコピーして控えた
□ 開発用Rulesを貼った
□ Publish / 公開 を押した
□ アプリを起動した
□ 新規登録できた
□ チーム作成できた
□ タスク作成できた
□ メンバー追加できた
□ permission-deniedが出ないことを確認した
□ 本番では使わないと理解した

ミニ確認問題

Q1. 開発用Rulesの if true は何を意味しますか?

回答

常に許可するという意味です。

誰でも読み書きできます。


Q2. 全開放Rulesは本番公開で使えますか?

回答

使えません。

誰でもデータを読んだり書いたりできるため危険です。


Q3. write には何が含まれますか?

回答

作成・更新・削除が含まれます。

create
update
delete

Q4. permission-deniedが消えた場合、何が原因だった可能性が高いですか?

回答

Firestore Security Rulesが原因だった可能性が高いです。


Q5. このページでnpmや環境変数は必要ですか?

回答

必要ありません。

Firebase ConsoleでRulesを変更するだけです。


このページのまとめ

  • 開発用Rulesは、学習中だけ使う。
  • allow read, write: if true; は全開放。
  • 全開放Rulesでは、誰でも読み書きできる。
  • 動作確認には便利だが、本番では危険。
  • permission-denied の原因確認にも使える。
  • 本番前には、必ず安全なSecurity Rulesに変更する。
  • このページではnpmや環境変数は不要。

次のページでやること

次のページでは、users/{uid} のSecurity Rulesを作ります。

本人だけが自分のプロフィールを読み書きできるようにします。

教材トップへ戻る