Role / Security

本アプリには 3 つのロール (権限) が存在します。これらは src/contexts/RoleContext.tsx によってフロントエンドで管理され、Supabase の RLS (Row Level Security) によってバックエンドで保護されています。

ロールの定義

  1. User (一般ユーザー)
    • 権限: お知らせ・落とし物・Q&A の閲覧、マップの確認、投票の実行。
    • アクセス方法: 通常の URL アクセス。
  2. Admin (全体管理者)
    • 権限: 全データの閲覧・編集・削除、お知らせ・落とし物・Q&A の作成、投票結果の確認。
    • アクセス方法: /admin パスへのアクセス + Supabase Authによるパスワード認証。
  3. 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 ロール。

認証フロー

  1. Admin: 事前に発行されたパスワードでログイン。
  2. StallAdmin: 全体管理者が /admin から発行した QR コード、または前のシフト担当者が表示した「交代用 QR」を読み取ることでログイン (トークンによる検証) 。
  3. 一度ログインすると: localStorage にフラグが保存され、一定期間は QR なしでもアクセスが維持されます。

注意: フロントエンドのロール切り替えは UI の表示制御のためのものであり、書き込み制限などの真のセキュリティは Supabase 側の RLS ポリシーで担保されています。

バックエンド (Supabase RLS)

データベースの各テーブルには RLS (Row Level Security) が設定されており、不適切な書き込みを防止しています。

  • votes テーブル: 同一ユーザー (voter_id) からの重複投票を DB レベルで防止。
  • 各管理用テーブル: 公開アクセスは SELECT のみに制限。