本卡屬 FR-132 A.6(子母卡 CM-2559),機制三張之一。決策者 2026-10-07 晚裁:不逐顆補,先把架構做對——前端分三層守門,權限真相只有一份。本卡做第一層「路由」。建議 model:opus。
這一棒在做什麼(白話)
讓每一頁都有一道「進入門檻」,而且門檻定義在後端、前端只讀不寫。今天側欄的 42 頁在後端 route_capabilities 已各有一顆 ALL 門檻;另外約 100 支內頁(新增帳號、新增角色、問卷設計器、流程範本編輯、SMTP 設定…)沒登記,前端路由守衛只擋管理員旗標,網址直入就進得去。本卡:內頁全部登記進同一張表、後端回「我能進的路由名單」、前端一個全域守衛讀名單,沒有就導去無權限頁。做完新開一頁只要後端登記一列,側欄、路由守衛、角色明細「可見頁面」三者自動一致。
在哪裡(首腦核過)
FE 路由:src/config/router/index.js,141 條 path;路由守衛 :1090(requiresAdmin)、:1104(requiresPlatformAdmin),其餘不擋
FE 路由 name 與 DB ui_routes.name 對得上的只有 38 條(其餘 ~100 條內頁 DB 無列)
DB:ui_routes(側欄頁 42 列 url≠null)、route_capabilities(ALL 39 列=每側欄頁一顆進入門檻;ANY 84 列)
BE 可見頁判定:jedi-iam infra/repository/ui_route_repo_impl.py:64 get_viewable_by_capability_names(ALL 全有或 ANY 任一)
BE 權限清單端點:GET /users/me/capabilities(CM-2560,jedi-iam f4b08dcd)
FE 權限 store:src/stores/userStore.js(CM-2560 擴充,hasCap 讀它)
盤點表:docs/features/FR-132-2610-access-management/inventory/a6-button-capabilities.md(428 顆按鈕→API→權限;內頁進入權限=該頁主要動作那顆,多半查得到)
導覽觸發:router.push 157 處、router-link 7、Button link 26(約 190 處,未盤;本卡登記完就不必逐顆藏)
怎麼做
- 登記規則(寫死一句,新頁照辦):內頁的進入權限=它主要動作的權限——新增頁 create、編輯頁 update、檢視頁 read;側欄頁維持既有 ALL。每頁恰一顆 ALL;要「有任一就能進」的用 ANY 多列。
- 盤點二=登記本身:把 141 條 FE 路由逐條對到進入權限,產 inventory/a6-route-entry-capabilities.md(route name|path|進入權限|依據(盤點表行或附錄 A 行)|側欄頁/內頁),拿不準的列出回寫問首腦。純公開頁(login、about、setup、404)標「免登記」。
- DB:內頁登記進 ui_routes(enable=1、url=路徑、pid 掛所屬側欄分組、新增欄 is_menu=false 讓側欄不顯示——先查 ui_routes 有沒有既有欄能表達「不上側欄」,有就用既有)+ route_capabilities 一顆 ALL。一支 migration 全部登記;用 ui_routes.name 對 FE route name,不用 id。
- BE:/users/me/capabilities 回應加
routes: [name…](走 get_viewable_by_capability_names 同一條判定,含 is_menu=false 的頁),一次拿、不另開端點。
- FE:全域 beforeEach 讀 userStore 的 routes 名單;路由 name 不在名單且不是免登記頁→導 /403(沒有就新建一頁「您沒有進入此頁的權限」)。既有 requiresAdmin/requiresPlatformAdmin 守衛保留(主體域,另一軸)。登入後名單未到時不擋(與 CM-2560 的退路一致)。
- 守衛測試(規範的牙齒):BE 一支——FE 路由檔每條 name(扣免登記清單)在 ui_routes 都有列且恰一顆 ALL;突變:拿掉一列要紅。免登記清單寫在測試檔頂部、每條附理由。
- 先查再寫:ui_routes 既有欄位、jedi-iam 有沒有現成「依能力點算可見路由」以外的名單 API;有就用。
手測
- blspan(稽核人員)登入後網址列直打 /auth/user-form-mtrbac(新增帳號)→ 被導到無權限頁;blsadmin 進得去。
- blsit 側欄看到的頁、角色明細「可見頁面」預覽、直打網址能進的頁,三者一致。
- 新開一條測試路由不登記,守衛測試紅;登記後綠。
連帶
- 新增主線 migration → 回寫明講出貨基線待重產。角色明細樹(CM-2557 歸屬頁)與 CM-2563(三層樹、預覽 Dialog)讀的是同一張 ui_routes,內頁登記後會出現在樹上——這是對的(內頁的權限終於有真正的家),但 is_menu=false 的頁在「可見選單」預覽卡要標「非選單頁」。
紀律