【権限設計】owner・admin・member・viewerの違いを理解する
このページでやること
このページでは、チーム内の権限を整理します。
このアプリでは、メンバーごとに role を持たせます。
owner
admin
member
viewer
role とは、その人がチーム内で「何をできるか」を決める役割です。
今日のゴール
4つの権限の違いを理解します。
owner → 全部できる人
admin → 管理できる人
member → 作業できる人
viewer → 見るだけの人
このページでは、まだコードを大きく変更しません。
まずは、アプリ全体のルールを決めます。
npmや環境変数は必要?
このページでは、npmは使いません。
環境変数も設定しません。
このページでやることは、Firestoreに保存する role の意味を理解することです。
権限の種類を理解する
↓
Firestoreの保存場所を確認する
↓
どの操作を許可するか決める
Step 1:roleの保存場所を確認する
チームメンバーの権限は、Firestoreのここに保存します。
teams/{teamId}/members/{uid}
たとえば、次のような形です。
teams/team001/members/user001
uid: user001
email: yamada@example.com
displayName: 山田さん
role: owner
joinedAt: 参加日時
大事なのは、この部分です。
role: owner
この role によって、できることを変えます。
Step 2:4つのroleを決める
このアプリでは、次の4つを使います。
| role | 表示名 | 一言説明 |
|---|---|---|
owner | オーナー | チームを作った人。最上位 |
admin | 管理者 | メンバーやタスクを管理できる人 |
member | メンバー | タスクを作成・編集できる人 |
viewer | 閲覧者 | 見るだけの人 |
Firestoreには英語で保存します。
画面には日本語で表示します。
Step 3:ownerを理解する
owner は、チームの一番上の権限です。
チームを作成した人は、自動で owner にします。
チーム作成者
↓
role: owner
owner ができることは、基本的に全部です。
チーム削除
メンバー管理
タスク作成
タスク編集
タスク削除
権限変更
Step 4:adminを理解する
admin は、管理者です。
owner ほど強くはありませんが、チーム運用に必要な管理操作ができます。
role: admin
admin ができることの例です。
タスク作成
タスク編集
タスク削除
メンバー追加
一部の権限変更
ただし、owner 自体の削除や、チームそのものの削除は制限する設計にします。
Step 5:memberを理解する
member は、通常の作業メンバーです。
role: member
主に、タスクを作ったり、編集したりする人です。
タスクを見る
タスクを作る
タスクを編集する
ただし、削除やメンバー管理はできないようにします。
タスク削除 → できない
メンバー管理 → できない
チーム削除 → できない
Step 6:viewerを理解する
viewer は、見るだけの人です。
role: viewer
確認だけしたい人、外部共有に近い人、上長確認用などに使えます。
タスクを見る → できる
タスク作成 → できない
タスク編集 → できない
タスク削除 → できない
最も安全な権限です。
Step 7:権限表を作る
最初は、このルールで進めます。
| 操作 | owner | admin | member | viewer |
|---|---|---|---|---|
| チームを見る | ○ | ○ | ○ | ○ |
| タスクを見る | ○ | ○ | ○ | ○ |
| タスク作成 | ○ | ○ | ○ | × |
| タスク編集 | ○ | ○ | ○ | × |
| タスク削除 | ○ | ○ | × | × |
| メンバー一覧を見る | ○ | ○ | ○ | ○ |
| メンバー追加 | ○ | ○ | × | × |
| 権限変更 | ○ | △ | × | × |
| チーム削除 | ○ | × | × | × |
△ は、一部だけ許可するという意味です。
たとえば、admin は member を viewer に変えられるけれど、owner は変更できない、という設計にします。
Step 8:コードで判定する考え方
Flutter側では、role を見て判断します。
たとえば、タスク削除ならこうです。
bool canDeleteTask(String? role) {
return role == 'owner' || role == 'admin';
}
意味はこうです。
ownerなら削除できる
adminなら削除できる
それ以外は削除できない
Step 9:タスク作成できるか判定する
タスク作成は、owner、admin、member ができます。
viewer はできません。
bool canCreateTask(String? role) {
return role == 'owner' || role == 'admin' || role == 'member';
}
意味はこうです。
owner → 作成OK
admin → 作成OK
member → 作成OK
viewer → 作成NG
Step 10:タスク編集できるか判定する
タスク編集も、最初は owner、admin、member ができる設計にします。
bool canEditTask(String? role) {
return role == 'owner' || role == 'admin' || role == 'member';
}
viewer は見るだけです。
viewer → 編集できない
Step 11:メンバー管理できるか判定する
メンバー追加や削除は、owner と admin だけにします。
bool canManageMembers(String? role) {
return role == 'owner' || role == 'admin';
}
member と viewer は、メンバー管理はできません。
Step 12:チーム削除できるか判定する
チーム削除は、とても強い操作です。
そのため、owner だけにします。
bool canDeleteTeam(String? role) {
return role == 'owner';
}
admin でも削除できない設計にします。
owner → チーム削除OK
admin → チーム削除NG
member → チーム削除NG
viewer → チーム削除NG
Step 13:roleを日本語表示に変える
画面では、owner などをそのまま出すより、日本語の方が分かりやすいです。
String roleLabel(String role) {
switch (role) {
case 'owner':
return 'オーナー';
case 'admin':
return '管理者';
case 'member':
return 'メンバー';
case 'viewer':
return '閲覧者';
default:
return '不明';
}
}
これで、画面表示を変換できます。
owner → オーナー
admin → 管理者
member → メンバー
viewer → 閲覧者
Step 14:Firestoreの例を確認する
チーム作成者は、すでにこのように保存しています。
teams/{teamId}/members/{uid}
uid: ログイン中ユーザーのuid
email: メールアドレス
displayName: 表示名
role: owner
joinedAt: 参加日時
あとでメンバー追加を作るときは、追加された人を最初は member にします。
role: member
閲覧だけにしたい人は、viewer にします。
role: viewer
Step 15:本番ではRulesにも書く
Flutter側で権限チェックを入れるだけでは不十分です。
本番では、Firestore Security Rulesにも必ず書きます。
Flutter側
↓
ボタンを隠す・操作を止める
Firestore Rules側
↓
データを本当に守る
この教材では、まずFlutter側で理解します。
あとでSecurity Rulesのページで、Firestore側の制御も作ります。
よくある混乱ポイント
| 混乱すること | 考え方 |
|---|---|
| ownerとadminの違い | ownerは最上位。adminは管理者 |
| memberとviewerの違い | memberは作業できる。viewerは見るだけ |
| roleはどこに保存する? | teams/{teamId}/members/{uid} |
| roleは日本語で保存する? | 保存は英語。表示は日本語 |
| Flutter側だけで安全? | 本番ではRulesも必要 |
最短まとめ
読むのが大変な人は、ここだけ見てください。
roleは4つ
owner → 全部できる
admin → 管理できる
member → タスク作業できる
viewer → 見るだけ
保存場所
teams/{teamId}/members/{uid}
タスク削除できる人
owner
admin
チーム削除できる人
ownerだけ
閲覧だけの人
viewer
チェックリスト
□ ownerの意味を理解した
□ adminの意味を理解した
□ memberの意味を理解した
□ viewerの意味を理解した
□ roleの保存場所を確認した
□ teams/{teamId}/members/{uid} を理解した
□ タスク削除はowner/adminだけと決めた
□ チーム削除はownerだけと決めた
□ viewerは見るだけと理解した
□ Flutter側だけでなくRulesも必要と理解した
ミニ確認問題
Q1. チームを作成した人は、最初にどのroleになりますか?
回答
owner になります。
Q2. タスク削除ができるroleはどれですか?
回答
owner と admin です。
Q3. viewer はタスクを編集できますか?
回答
できません。
viewer は見るだけです。
Q4. roleはFirestoreのどこに保存しますか?
回答
次の場所に保存します。
teams/{teamId}/members/{uid}
Q5. 本番ではFlutter側のチェックだけで十分ですか?
回答
十分ではありません。
本番では、Firestore Security Rules側にも権限制御を書く必要があります。
このページのまとめ
- チーム内の権限は
roleで管理する。 roleはteams/{teamId}/members/{uid}に保存する。ownerは最上位で、基本的に全部できる。adminは管理者で、タスク削除やメンバー管理ができる。memberは通常メンバーで、タスク作成・編集ができる。viewerは閲覧者で、見るだけ。- Firestoreには英語で保存し、画面では日本語に変換する。
- 本番ではFirestore Security Rulesにも権限制御を書く。
- このページではnpmや環境変数は不要。
次のページでやること
次のページでは、teams/{teamId}/members を取得して、メンバー一覧画面を作ります。
