【本番用Rules】ログインユーザー・チームメンバー・権限ごとに制限する
このページでやること
このページでは、学習中だけ使う「全開放ルール」を設定します。
これは、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.dart の projectId を確認 |
| アプリに反映されない | 公開していない | 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を作ります。
本人だけが自分のプロフィールを読み書きできるようにします。
