SDD: RAG Portal 多人授權(#24 #25)— 純設計文件,待審不 merge #49

Merged
Leo merged 4 commits from sdd-portal-auth into main 2026-07-14 03:32:01 +00:00
Owner

純設計文件 PR(零 .ts 改動):system-dev/docs/3-specs/portal-auth/(requirements/design/tasks)+ guard KNOWN_SDDS 登記一行(00-sdd-protocol 程序,總管 #24/#25 交辦即授權)。

關鍵決策點(審查快掃)

# 決策 建議 待裁?
D-1 Portal 形態 cypher-executor /portal 路由(非獨立 worker)——重用 kbdb proxy、零新部署單位/secret 面 待總管確認
D-3 「庫」的定義(最大單一決策) metadata_json.$.library(ingest 蓋章)+Vectorize metadata index+庫目錄 template portal_library;未標記舊資料 fallback=general。放棄:owner_id 子 namespace 當庫(要搬 45 萬筆+N 次查詢)、source 前綴(Vectorize 無前綴匹配) 待總管/leo 裁
D-2 帳號資料隔離 portal_user 存 {tenant}::portal 子 namespace——盤現況發現若存租戶下,email/雜湊會進 keyword 搜尋結果(searchEntries=content LIKE 核實) 建議採納
D-5 密碼 KDF PBKDF2-SHA256 600k(WebCrypto 原生零依賴)——偏離 issue 字面 bcrypt/argon2(兩者 Workers 無原生,argon2 要 WASM 依賴、bcrypt 純 JS 燒 CPU) 待總管點頭
D-6 雜湊放哪 slot(KBDB D1)非 CF Secrets——Secrets 是部署期靜態,admin runtime CRUD 物理上寫不進去 定案傾向強
D-4 graph 模式庫權限 第一波粗閘(有 graph 來源庫權限才開放;可收緊 admin-only),細粒度第二波 待裁(機密洩漏品味題)
D-7 owner secret 關係 並存:owner=超管(console 不動),portal admin=業務管理員;bootstrap 走 console owner session(無新 secret) 建議採納
D-8 工作流頁 預設 admin 可見、一般用戶不見(leo「兩頁」與「工作流可顯示」取交集),config 可改 all 待裁(輕)

Enforce 核心

Portal 前端絕不下發租戶字串(現行 console 是下發的)——只持 session token,/portal/data/* server 端注入 owner_id+library filter;卡片 by-id 逐筆驗庫。

實作切分

P1 KBDB library filter 地基(0.5-1天)→ P2 用戶模型+認證 API(1天)→ P3 /portal UI+enforce(1-1.5天,最大件)→ P4 admin 頁+工作流(1天)。各自可獨立 PR、驗收在 tasks.md。

風險

Vectorize $in 支援待 P1 第一件事實測(fallback 已設計);降級方案(共享唯讀連結+IP 白名單)觸發條件寫在 requirements。

對應 issue:#24 #25(審過本 SDD 才動工)。

🤖 Generated with Claude Code

純設計文件 PR(零 .ts 改動):`system-dev/docs/3-specs/portal-auth/`(requirements/design/tasks)+ guard KNOWN_SDDS 登記一行(00-sdd-protocol 程序,總管 #24/#25 交辦即授權)。 ## 關鍵決策點(審查快掃) | # | 決策 | 建議 | 待裁? | |---|---|---|---| | D-1 | Portal 形態 | cypher-executor `/portal` 路由(非獨立 worker)——重用 kbdb proxy、零新部署單位/secret 面 | 待總管確認 | | D-3 | **「庫」的定義(最大單一決策)** | `metadata_json.$.library`(ingest 蓋章)+Vectorize metadata index+庫目錄 template `portal_library`;未標記舊資料 fallback=general。放棄:owner_id 子 namespace 當庫(要搬 45 萬筆+N 次查詢)、source 前綴(Vectorize 無前綴匹配) | **待總管/leo 裁** | | D-2 | 帳號資料隔離 | portal_user 存 `{tenant}::portal` 子 namespace——盤現況發現若存租戶下,**email/雜湊會進 keyword 搜尋結果**(searchEntries=content LIKE 核實) | 建議採納 | | D-5 | 密碼 KDF | PBKDF2-SHA256 600k(WebCrypto 原生零依賴)——**偏離 issue 字面 bcrypt/argon2**(兩者 Workers 無原生,argon2 要 WASM 依賴、bcrypt 純 JS 燒 CPU) | 待總管點頭 | | D-6 | 雜湊放哪 | slot(KBDB D1)非 CF Secrets——Secrets 是部署期靜態,admin runtime CRUD 物理上寫不進去 | 定案傾向強 | | D-4 | graph 模式庫權限 | 第一波粗閘(有 graph 來源庫權限才開放;可收緊 admin-only),細粒度第二波 | **待裁**(機密洩漏品味題) | | D-7 | owner secret 關係 | 並存:owner=超管(console 不動),portal admin=業務管理員;bootstrap 走 console owner session(無新 secret) | 建議採納 | | D-8 | 工作流頁 | 預設 admin 可見、一般用戶不見(leo「兩頁」與「工作流可顯示」取交集),config 可改 all | 待裁(輕) | ## Enforce 核心 Portal 前端**絕不下發租戶字串**(現行 console 是下發的)——只持 session token,`/portal/data/*` server 端注入 owner_id+library filter;卡片 by-id 逐筆驗庫。 ## 實作切分 P1 KBDB library filter 地基(0.5-1天)→ P2 用戶模型+認證 API(1天)→ P3 /portal UI+enforce(1-1.5天,最大件)→ P4 admin 頁+工作流(1天)。各自可獨立 PR、驗收在 tasks.md。 ## 風險 Vectorize `$in` 支援待 P1 第一件事實測(fallback 已設計);降級方案(共享唯讀連結+IP 白名單)觸發條件寫在 requirements。 對應 issue:#24 #25(審過本 SDD 才動工)。 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Leo added 3 commits 2026-07-13 14:09:57 +00:00
Leo added 1 commit 2026-07-14 03:32:01 +00:00
Leo merged commit 18c0846af0 into main 2026-07-14 03:32:01 +00:00
Sign in to join this conversation.