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

【権限設計】owner・admin・member・viewerの違いを理解する

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

このページでやること

このページでは、チーム内の権限を整理します。

このアプリでは、メンバーごとに 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:権限表を作る

最初は、このルールで進めます。

操作owneradminmemberviewer
チームを見る
タスクを見る
タスク作成×
タスク編集×
タスク削除××
メンバー一覧を見る
メンバー追加××
権限変更××
チーム削除×××

は、一部だけ許可するという意味です。

たとえば、adminmemberviewer に変えられるけれど、owner は変更できない、という設計にします。


Step 8:コードで判定する考え方

Flutter側では、role を見て判断します。

たとえば、タスク削除ならこうです。

bool canDeleteTask(String? role) {
  return role == 'owner' || role == 'admin';
}

意味はこうです。

ownerなら削除できる
adminなら削除できる
それ以外は削除できない

Step 9:タスク作成できるか判定する

タスク作成は、owneradminmember ができます。

viewer はできません。

bool canCreateTask(String? role) {
  return role == 'owner' || role == 'admin' || role == 'member';
}

意味はこうです。

owner → 作成OK
admin → 作成OK
member → 作成OK
viewer → 作成NG

Step 10:タスク編集できるか判定する

タスク編集も、最初は owneradminmember ができる設計にします。

bool canEditTask(String? role) {
  return role == 'owner' || role == 'admin' || role == 'member';
}

viewer は見るだけです。

viewer → 編集できない

Step 11:メンバー管理できるか判定する

メンバー追加や削除は、owneradmin だけにします。

bool canManageMembers(String? role) {
  return role == 'owner' || role == 'admin';
}

memberviewer は、メンバー管理はできません。


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はどれですか?

回答

owneradmin です。


Q3. viewer はタスクを編集できますか?

回答

できません。

viewer は見るだけです。


Q4. roleはFirestoreのどこに保存しますか?

回答

次の場所に保存します。

teams/{teamId}/members/{uid}

Q5. 本番ではFlutter側のチェックだけで十分ですか?

回答

十分ではありません。

本番では、Firestore Security Rules側にも権限制御を書く必要があります。


このページのまとめ

  • チーム内の権限は role で管理する。
  • roleteams/{teamId}/members/{uid} に保存する。
  • owner は最上位で、基本的に全部できる。
  • admin は管理者で、タスク削除やメンバー管理ができる。
  • member は通常メンバーで、タスク作成・編集ができる。
  • viewer は閲覧者で、見るだけ。
  • Firestoreには英語で保存し、画面では日本語に変換する。
  • 本番ではFirestore Security Rulesにも権限制御を書く。
  • このページではnpmや環境変数は不要。

次のページでやること

次のページでは、teams/{teamId}/members を取得して、メンバー一覧画面を作ります。

教材トップへ戻る