Role / Security
本アプリには 3 つのロール (権限) が存在します。これらは src/contexts/RoleContext.tsx によってフロントエンドで管理され、Supabase の RLS (Row Level Security) によってバックエンドで保護されています。
ロールの定義
- User (一般ユーザー)
- 権限: お知らせ・落とし物・Q&A の閲覧、マップの確認、投票の実行。
- アクセス方法: 通常の URL アクセス。
- Admin (全体管理者)
- 権限: 全データの閲覧・編集・削除、お知らせ・落とし物・Q&A の作成、投票結果の確認。
- アクセス方法:
/adminパスへのアクセス + Supabase Authによるパスワード認証。
- StallAdmin (模擬店運営)
- 権限: 自分の団体の混雑状況・在庫状況の更新。
- アクセス方法: Adminユーザーまたはシフト前任者が生成した
idとtokenパラメータを含む QR コードによる認証。
権限識別の仕組み
フロントエンド RoleContext.tsx / /booth/page.tsx
現在の URL パス、localStorage、および URL パラメータの状態を組み合わせてロールを決定しています。
- パスに
/adminを含み、localStorage.admin_authが"true"→adminロール。 - パスに
/boothを含み、URL のtokenが有効であるかlocalStorage.booth_authが"true"→stall-adminロール。
認証フロー
- Admin: 事前に発行されたパスワードでログイン。
- StallAdmin: 全体管理者が
/adminから発行した QR コード、または前のシフト担当者が表示した「交代用 QR」を読み取ることでログイン (トークンによる検証) 。 - 一度ログインすると:
localStorageにフラグが保存され、一定期間は QR なしでもアクセスが維持されます。
注意: フロントエンドのロール切り替えは UI の表示制御のためのものであり、書き込み制限などの真のセキュリティは Supabase 側の RLS ポリシーで担保されています。
バックエンド (Supabase RLS)
データベースの各テーブルには RLS (Row Level Security) が設定されており、不適切な書き込みを防止しています。
votesテーブル: 同一ユーザー (voter_id) からの重複投票を DB レベルで防止。- 各管理用テーブル: 公開アクセスは
SELECTのみに制限。