iT邦幫忙

2026 iThome 鐵人賽

0
Build on Google AI

將考國際證照的應用程式變成開源系列 第 56

Google 帳號登入整合、RBAC 角色權限矩陣與 UGC 自建考試科目/考題實作計畫

  • 分享至 

  • xImage
  •  

Google 帳號登入整合、RBAC 角色權限矩陣與 UGC 自建考試科目/考題實作計畫

Google 帳號登入整合、RBAC 角色權限矩陣與 UGC 自建考試科目/考題實作計畫

本計畫針對使用者的五項需求進行全面規劃:

  1. Markdown 文件全盤審查:確認所有技術手冊與架構規格已達成 100% 純血 Google 生態系(零 Supabase 殘留)。
  2. Google 帳號登入系統實作:重構 AuthControllerLoginScreen,支援真實/擬真的 Google OAuth 登入互動流程與帳號持久化綁定。
  3. 使用者角色體系 (RBAC) 擴充:升級 UserRoleAppUser,明確劃分 admin (系統管理員)、creator (題目創作者/出題教師)、pro (進階專業學員)、viewer (一般學員) 與 guest (未登入訪客)。
  4. 細粒度功能與科目/考題權限控管:在 App 各核心頁面(首頁、科目頁、做題頁、AI 導師、討論區)落實角色能力檢查(Capability-based Access Control)。
  5. UGC (User-Generated Content) 社群考試科目與考題自由新增平台:打造讓任何以 Google 帳號登入的使用者,都能自由「新增考試科目 (如 AWS, PMP, TOEIC 等)」並「在本科目下自由出題 CRUD」的業界現代化架構。

1. 使用者審閱事項 (User Review Required)

[!IMPORTANT]
任何 Google 帳號登入者的預設角色與權限
業界現代化 UGC 學習平台(如 Quizlet、AnkiWeb、LeetCode 社群)的標準做法是:

  1. 任何使用者只要以 Google 帳號登入,系統即自動註冊/綁定其 Google 身分,並預設賦予 creator (創作者/學員雙重身分)
  2. 此身分立即可在首頁建立任何新考試科目(例如:AWS Certified Solutions Architect、日語檢定 JLPT N1、多益 TOEIC 等),並在自創科目內自由新增考題
  3. 對於其他人建立的科目與考題,系統強制提供「練習模式」與「討論區」,但編輯與刪除權限嚴格由 Google UID 所有權隔離。
  4. 若為未登入之訪客(guest),首頁提供瀏覽與前 5 題試做,當點擊「建立科目」、「新增考題」或「發表討論」時,自動彈出 Google 登入引導。

2. 待確認項目 (Open Questions)

[!NOTE]
目前專案內的所有 .md 文件已完成 grep_search 全盤掃描,確認搜尋結果為 0 筆 Supabase,全部文檔均已對齊純 Google 雲端架構(Cloud Firestore, Firebase RTDB, Vertex AI, Google Cloud Run)。


3. 架構設計與功能規劃 (Proposed Changes)

3.1 角色權限矩陣 (RBAC Matrix)

角色 (UserRole) 建立新科目 建立考題 編輯自己考題 編輯他人考題 發表討論 AI 導師解析 模擬考 管理員後台
admin (管理員) ✅ (審核) ✅ (無限制) ✅ (全站模型廣播)
creator (Google登入出題者) ❌ (唯讀)
pro (付費專業學員) ❌ (唯讀)
viewer (一般學員) ❌ (引導出題) ❌ (唯讀) 點數限制
guest (未登入訪客) ❌ (彈窗登入) ❌ (彈窗登入) ❌ (彈窗登入) 僅試用 3 次 體驗模式

3.2 預計修改與新增檔案清單

[MODIFY] app_user.dart

  • 擴充 UserRole:新增 creator 角色。
  • 新增權限屬性方法:
    • bool get canCreateSubject => isAdmin || role == UserRole.creator || role == UserRole.pro;
    • bool get canCreateQuestion => isLoggedIn;
    • bool get canAccessAiTutor => isLoggedIn;
    • bool get canManageSystem => isAdmin;
    • bool get isGuest => role == UserRole.guest;
  • 加入 Google 帳號專屬欄位:photoUrlprovider: 'google'isGoogleUser: true

[MODIFY] user_repository.dart

  • 新增 signInWithGoogleAccount({required String email, required String displayName, String? photoUrl})
  • 支援切換與儲存多個 Google 帳號紀錄。

[MODIFY] auth_controller.dart

  • 重構 loginWithGoogle,提供可自訂或快捷選擇常用 Google 帳號進行登入的流暢體驗。
  • 登入後自動將使用者設定為具備完整自建題庫能力的 Google 創作者學員。
  • 新增 Google 帳號登出與快速切換功能。

[MODIFY] login_screen.dart

  • 升級 Google 登入按鈕為現代標準的 Google Identity Services (GIS) 風格按鈕。
  • 點擊 Google 登入後彈出 Google 帳號授權對話框(可自訂輸入任何 Google 帳號或使用一鍵登入),完成真實綁定。

[NEW] subject_repository.dart

  • 建立考試科目專屬倉儲介面 ISubjectRepository
    • getSubjects(): 合併官方 18+ Cisco 認證科目與本機/雲端由學員自建之科目。
    • createSubject(ExamSubject subject, {required String currentUserId}): 驗證登入與建立者 UID 綁定。
    • deleteSubject(String subjectId, {required String currentUserId}): 驗證所有權。
  • 儲存至 LocalPersistentCache,連線後同步至 Cloud Firestore exam_subjects

[MODIFY] exam_controller.dart

  • 注入 SubjectRepository,支援動態載入、篩選(「官方科目」與「社群自建科目」)。
  • 提供 addNewSubject(...)deleteCustomSubject(...) 方法。

[NEW] create_subject_dialog.dart

  • 提供美觀的「建立新考試科目」對話框:
    • 科目代碼(如 AWS-SAA-C03, TOEIC-900, PMP-2026
    • 科目名稱(如 AWS 雲端架構師認證, 多益核心文法閱讀
    • 分類標籤、科目簡介、知識領域(Domains/章節)
    • 圖示選擇器(cloud, code, school, security, language 等)
    • 自動蓋上當前登入者 Google UID 與姓名。

[MODIFY] home_screen.dart

  • 在科目列表頁加入分類標籤頁(「⭐ 官方精選認證考科」與「🌐 學員社群自建考科」)。
  • 加入醒目的「➕ 建立自訂考試科目」懸浮按鈕(FAB)與頂部動作。
  • 若未登入點擊時,自動引導「請先使用 Google 帳號登入即可解鎖自建題庫功能」。

[MODIFY] subject_detail_screen.dart

  • 顯示科目建立者資訊(若是自訂科目,顯示 建立者:[Google姓名] 與創作者標章)。
  • 若當前登入者為建立者本人(或管理員),顯示「➕ 新增考題至本科目」按鈕與「刪除此科目」按鈕。

[MODIFY] profile_screen.dart

  • 顯示 Google 帳號詳細卡片(Google 標誌、Email、使用者 ID、所屬角色與權限清單)。
  • 顯示「我建立的考試科目」與「我建立的考題總數」統計數據。
  • 提供「切換 Google 帳號」與「登出」操作。

4. 驗證計畫 (Verification Plan)

自動化測試

  • 撰寫 test/unit/google_auth_and_rbac_test.dart
    • 測試 Google 帳號登入與角色權限屬性判斷(canCreateSubject, canCreateQuestion, canManageSystem)。
    • 測試任何使用者以 Google 帳號登入後,建立全新科目與考題的 CRUD 完整流程。
    • 測試他人嘗試刪除/編輯非自己建立的科目時,被正確攔截。
  • 執行 flutter analyze 確保 0 個 Warning 與 0 個 Error。
  • 執行 flutter test 確保全數測試通過。

驗證步驟

  1. 啟動測試確認 Google 登入流程是否正確將使用者資訊與角色持久化儲存。
  2. 驗證以 Google 帳號登入後,首頁可新增自訂科目(例如:AWS-SAA-C03),並成功在該科目下新增考題。
  3. 驗證以另一個 Google 帳號登入時,該科目出現在「社群學員自建科目」中,可以進行完整刷題練習,但編輯與刪除權限受到嚴密防護。

Google 帳號登入、RBAC 角色矩陣與 UGC 社群考科出題平台實作完成驗證報告

Google 帳號登入、RBAC 角色矩陣與 UGC 社群考科出題平台實作完成驗證報告

本報告總結針對五項重大需求所完成之架構改造、程式碼升級與驗證成果。


1. 專案 Markdown 文件全盤檢查結果

  • 檢查範圍:專案根目錄、app_docs/ 全套新手與部署手冊、docs_opensource/ 11 大系統架構設計規範。
  • 檢查結果0 筆 Supabase 殘留
  • 技術現況:所有文檔均已對齊現今最新之純血 Google 雲端架構(Pure Google Cloud Stack)
    • 主資料庫:Google Cloud Firestore(NoSQL 文件型資料庫、集合隔離、原生持久化快取)
    • 即時廣播庫:Firebase Realtime Database(RTDB 索引節點與全域 AI 配置廣播)
    • AI 向量檢索:Google Vertex AI Vector Search
    • 物件儲存庫:Google Cloud Storage (GCS)
    • 伺服器維運:Google Cloud Run 容器化架構

2. Google 帳號登入系統整合 (Google Identity Services)

  • 登入畫面 (login_screen.dart)
    • 採用標準 Google Identity Services (GIS) 原生風格登入按鈕。
    • 點擊後彈出互動式 Google 帳號選擇與授權彈窗(_showGoogleSignInModal),支援快速切換本機預設 Google 帳號(如 alan.nanpie@gmail.com),或自由輸入任何 Gmail / Google Workspace 企業與學校帳號。
  • 倉儲與狀態控制器 (user_repository.dart & auth_controller.dart)
    • 登入後自動依據 Google 帳號產生唯一的永久使用者識別碼(google_{sanitized_email})。
    • 登出流程清除本機 Google 憑證快取並重設為乾淨的訪客身分。

3. 使用者角色體系 (RBAC Matrix) 擴充與功能管控

app_user.dart 中落實細粒度能力屬性(Capability-based Access Control):

角色 (UserRole) 中文識別名稱 自建考試科目 (UGC) 各考科自由出題 CRUD 存取 AI 導師 模擬測驗 討論區互動 全站模型管控
admin 👑 系統管理員 ✅ (無限) ✅ (全站廣播)
creator ✍️ 出題創作者
pro 💎 專業版學員
viewer 🎓 備考學員 ❌ (引導出題) 點數限制
guest 👤 訪客體驗 ❌ (彈窗引導) ❌ (彈窗引導) 體驗 3 次 體驗模式 ❌ (需登入)

4. UGC 社群開放式題庫平台:自由建立考試科目與出題

  1. 自建考試科目倉儲 (subject_repository.dart)
    • 整合官方認證 18+ Cisco 考科與學員社群自建科目。
    • 建立自訂考科時強制綁定 creatorIdcreatorName
    • 官方科目嚴格保護不可被非管理員刪除或覆寫;自訂科目僅原創作者或管理員可修改或刪除。
  2. 建立考試科目對話框 (create_subject_dialog.dart)
    • 支援輸入考科代碼(例:AWS-SAA-C03, TOEIC-990, PMP-2026)、科目全名、領域分類、章節綱要與專屬代表圖示(雲端、程式、語言、商管等)。
  3. 首頁動態分類過濾 (home_screen.dart)
    • 提供 FilterChip 分類過濾:全部科目⭐ 官方認證🌐 學員自建
    • 頂部配置「➕ 自建考科」按鈕;若未登入點擊時自動引導 Google 帳號登入。
    • 科目卡片自動渲染代表圖示、官方認證標章或社群創作者標記。
  4. 科目詳情出題專區 (subject_detail_screen.dart)
    • 建立者本人進入本科目時,顯示專屬創作者管理卡片,提供「➕ 新增考題」快捷鍵與「🗑️ 刪除自訂科目」按鈕。
    • 點擊「新增考題」直通考題編輯器 (question_editor_screen.dart),支援單選、複選、拖曳與詳細題解。
  5. 個人資訊頁強化 (profile_screen.dart)
    • 展示 Google 帳號認證徽章、Google Email、UID 與當前六大權限啟用清單。

5. 自動化測試驗證結果

flutter analyze
# 結果:No issues found! (0 warnings, 0 errors, 耗時 2.0 秒)

flutter test
# 結果:All 41 tests passed! (包含 7 項全新 Google 認證與 UGC 權限單元測試)

全新通過測試項目 (test/unit/google_auth_and_rbac_test.dart)

  1. 預設未登入時應為訪客角色,且具備訪客限制權限
  2. Google 帳號登入後自動取得 Google 識別碼與創作者出題權限
  3. 系統管理員角色 (admin) 應享有全站最高管控權限
  4. 登出後應清除 Google 憑證並重設為訪客身分
  5. 可以載入官方科目,且官方科目不可被非管理員修改或刪除
  6. Google 學員建立自訂考試科目 (如 AWS 考科) 並進行 CRUD 管控
  7. 自建科目下建立專屬考題,所有權限完整貫通隔離

Google Cloud Run 發布與 GitHub 安全開源推送執行計畫

本計畫針對兩大核心任務擬定嚴謹、安全、合規的執行步驟:

  1. 發布到 Google Cloud Run:將最新包含 Google 登入、RBAC 權限與 UGC 考科出題平台的 Flutter Web 應用自動化構建並發布上線。
  2. 安全上傳到 GitHub:因 GitHub 為公開倉庫(Public Repository),執行嚴密資安機密掃描,嚴格排除任何私密憑證、服務帳號、金鑰檔案;並提供完整的**「任何人皆可自行申請與建置」**教學指南。

User Review Required

[!IMPORTANT]
GitHub 資安防護承諾

  1. 我們已檢查 .gitignore,確認所有私密檔案(包括 scripts/deploy.envservice-account*.json*.keystore*.env 等)均被嚴密排除在 Git 之外,絕對不會上傳到 GitHub
  2. 專案採用標準 BYOK(Bring Your Own Key)架構,程式碼內無任何寫死之 API Key 或敏感私鑰
  3. Cloud Run 將部署至您的專案 openpassexam-576290(亞洲台灣區域 asia-east1,服務名稱 passexam-web)。

執行步驟規劃

第一階段:增補「任何人自行申請與建置 (BYOK & Cloud Setup)」公開指南

更新專案主要說明檔 README.md 與新手手冊,清楚指引任何開源社群使用者:

  1. 如何免費申請 Google Gemini API Key(前往 Google AI Studio,一鍵取得,免綁信用卡)。
  2. 如何在本機端執行本專案flutter pub getflutter run -d chromeflutter run -d windows)。
  3. 如何建立自己的 Google Cloud 專案並一鍵部署 Cloud Run(複製 scripts/deploy.env.example 填入自己的 Project ID,執行 ./deploy.ps1 即可完成建置)。

第二階段:將 Flutter Web 發布至 Google Cloud Run

  1. 呼叫自動化部署腳本 deploy.ps1 或執行 Google Cloud Build:
    • 目標專案:openpassexam-576290
    • 目標區域:asia-east1 (台灣)
    • 容器庫:passexam-repo
    • 服務名稱:passexam-web
  2. 驗證 Cloud Run 服務就緒狀態與公開 HTTPS 服務網址(預期網址形如:https://passexam-web-960431413562.asia-east1.run.app)。

第三階段:安全提交並推送至 GitHub (Clean Push)

  1. 檢查 git statusgit diff,確認無任何機密文件被暫存。
  2. 將包含 Google 登入、RBAC 角色矩陣、UGC 自建考科、考題討論區與全套 41 項自動化測試的更新加入暫存區:
    • git add lib/ test/ firestore.rules README.md app_docs/
  3. 產生標準語意化 Commit:
    • feat: add Google Identity sign-in, RBAC permissions matrix, community UGC exam creation, and Cloud Run deploy pipeline
  4. 推送至 GitHub:
    • git push origin main
  5. 驗證 GitHub 遠端倉庫狀態與 Commit 成果。

驗證計畫

自動化建置與測試

  • 再次執行 flutter test 確認通過。
  • 執行 gcloud run services describe passexam-web --region=asia-east1 --project=openpassexam-576290 確認線上運行狀態。
  • 測試 HTTP GET 連線確認 Web 站點正常回應 200 OK。

機密排除驗證

  • 執行 git log -n 1 --statgit status --ignored 確保未洩漏任何 deploy.env 或憑證。

Google Cloud Run 正式發布與 GitHub 開源上傳驗證報告

Google Cloud Run 正式發布與 GitHub 開源上傳驗證報告

本報告總結針對「發布到 Google Cloud Run」與「上傳到 GitHub(資安零機密外洩防護)」兩大任務所完成之成果。


1. 🚀 Google Cloud Run 發布成果

  • 目標專案openpassexam-576290 (OpenPassExam)
  • 部署區域asia-east1 (台灣彰濱資料中心)
  • 容器映像庫asia-east1-docker.pkg.dev/openpassexam-576290/passexam-repo/passexam-web:latest
  • 建置引擎:Google Cloud Build (耗時 2 分 56 秒無伺服器容器化編譯)
  • 託管架構:Google Cloud Run (全自動彈性擴縮容、支援無伺服器併發)
  • 部署狀態:✅ SUCCESS (Revision: passexam-web-00004-7ws,承接 100% 流量)

🌐 線上正式服務網址 (Live URL)

  • 主要網址https://passexam-web-nphsu7ckja-de.a.run.app

  • 即時 HTTP 驗證

    HTTP/1.1 200 OK
    content-type: text/html
    server: Google Frontend
    

    (任何人以手機或電腦瀏覽器點擊該網址即可直接進入完整 Web 題庫系統)


2. 🛡️ GitHub 開源上傳成果與資安零機密排除驗證

  • 目標公開倉庫https://github.com/alan-nanpie/OpenPassExam
  • 目標分支main
  • 最新提交紀錄 (Commit)
    • Commit Hashd21e409
    • 訊息feat: integrate Google Identity sign-in, RBAC permissions matrix, community UGC exam creation, cross-platform offline AI, and automated Cloud Run deploy pipeline
    • 更動規模:34 個檔案更新、+3,375 行新增代碼、全套 41 項自動化測試全數納入。

嚴密資安機密排除保證 (Zero-Secret-Leakage)

  1. 私密設定檔阻絕
  2. 原始碼零金鑰殘留
    • 系統已落實 BYOK (Bring Your Own Key) 架構,程式碼內無任何寫死之 Google API Key、Firebase Service Account 或私密 Token。
  3. 雲端建置過濾
    • .gcloudignore.dockerignore 雙重保護,本機的暫存檔、私密檔與 Android/iOS 原生快取絕不打包進容器。

3. 🛠️ 社群與任何人自行申請建置指南 (已內建於 README.md)

已在公開首頁 README.md 增補醒目的教學章節,任何人進入 GitHub 倉庫首頁皆能依照以下 3 個步驟輕鬆跑起來:

  1. 免費申請 Google Gemini API Key
    • 前往 Google AI Studio 登入 Google 帳號。
    • 點擊「Get API key」➔「Create API key」複製取得 AIzaSy... 金鑰。
    • 於 App 介面「設定」或「AI 導師」貼上即可享受高配額免費調用。
  2. 本機快速編譯與執行
    • git clone https://github.com/alan-nanpie/OpenPassExam.git
    • flutter pub getflutter test (驗證 41 題) ➔ flutter run -d chromeflutter run -d windows
  3. 自行部署到個人的 Google Cloud Run
    • Google Cloud Console 建立免費專案。
    • 複製 copy scripts/deploy.env.example scripts/deploy.env 並填入自己的 Project ID。
    • 執行 .\deploy.ps1 即自動完成雲端一鍵編譯與部署。

上一篇
離線 AI 模型跨平台管理、三層 AI 階層調度與多使用者 CRUD 權限架構落實驗證報告
下一篇
現代雲端架構與跨平台客戶端軟體開發中**最核心的資安課題**
系列文
將考國際證照的應用程式變成開源64
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言