本卡屬 FR-132(母卡 CM-2510),A.3 判定層第 4 張。依賴:T-3.3。建議 model:opus。
今天有四個地方各自判斷「這人有哪些權限」:API 判定、側欄選單、選單明細、JWT(登入後隨每個請求送出的身分憑證)裡的 is_admin 欄位。其中選單明細與 is_admin 不過濾已到期、已停用的指派——管理員角色過期了,他重新登入仍看得到管理頁入口。這張卡讓四者吃同一份「有效指派+展開結果」,順便修掉這兩個資安漏洞。各自改必漏一條,症狀是「選單看得到、點進去 403」且不報錯。
~/Projects/Jedicogy/module/jedi-python-package/jedi-iam/jedi_iam/infra/repository/ui_route_repo_impl.py:70-141 選單可見性(已套有效條件,改吃展開服務比對 route_capabilities)
~/Projects/Jedicogy/module/jedi-python-package/jedi-iam/jedi_iam/app/service/user_service.py:522-529,547 選單明細(走 user.roles → role.capabilities,不過濾有效指派)
~/Projects/Jedicogy/module/jedi-python-package/jedi-iam/jedi_iam/middleware/jwt_mw.py:79 JWT is_admin claim(不過濾有效指派)
FE src/config/router/index.js:1057-1066 requiresAdmin 吃 claim(不用改,claim 修好自動正確)
route_capabilities(requirement ALL/ANY 規則照舊)。user.roles → role.capabilities。is_admin:只看有效指派(起訖、啟用、未刪除)中的角色 is_admin 旗標(D7:看旗標,不看是否持有 *.*.*)。UPDATE user_roles SET ends_at = now() - interval '1 day' WHERE ...(測試帳號),重新登入看側欄管理頁入口消失;改回後恢復。pyproject.toml 用 grep -n 'jedi-iam\|jedi-common' pyproject.toml 找行號(目前 pin 約在第 63-64 行、path 註解行約在第 116-117 行),取消 path 那行註解、註解掉 pin,poetry update jedi-iam jedi-common(一律指定套件名)。path 改動不 commit,改套件源碼在 ~/Projects/Jedicogy/module/jedi-python-package/ 另行 commit。絕不發版、絕不推 Nexus。