跳轉到

檢查存取(Check Access)

功能群:系統管理|權限模型先讀 功能群總覽 §2|所在頁:指派

事實基準:2026-10-08 從 FE src/views/access/CheckAccessBar.vue、EffectiveAccessView.vue、src/composables/useEffectiveAccess.js + jedi-iam role_assignment_route.py(UserEffectiveAccessRoute)、app/service/effective_access_service.py 掃出。

變更紀錄

日期 FR 變更
2026-10-08 FR-132 新功能:輸入帳號,列出每項權限的來源角色與到期日、登入後可見選單;管理員顯示豁免說明

1. 功能描述

檢查存取回答「這個人現在到底能做什麼、權限從哪裡來、什麼時候失效」。它不是獨立 route,嵌在 指派 頁頂部:在搜尋框輸入姓名或帳號選定一人後,指派表那塊換成檢查結果;網址帶 ?check=<user_uid>,可直接分享;按「清除」回到指派表。

結果與實際判定、側欄選單吃同一份展開結果,不另算一套。

主要使用者:租戶管理員(排查「某人說某個按鈕不見了」)。

角色速覽

角色 能做什麼
持 iam.user.read 查任何同租戶使用者
任何登入者(API 層) 查自己

1.1 功能總覽

# 功能 說明 位置
1 選人 自動完成搜尋姓名或帳號,必須從清單選 搜尋框
2 摘要 「共 N 項權限,來自 M 個角色」 結果左上
3 豁免說明 超級管理員、原廠管理員、管理員角色各一句,同時成立全列 結果左上
4 權限表 依頁分組;每列:權限名、來源角色、到期(多個來源時 tooltip 逐一列出) 結果左欄
5 沒有權限 「該使用者目前沒有任何權限」:沒有有效指派,或指派的角色皆已到期或停用 結果左欄
6 登入後的可見選單 該人登入後側欄出現的頁面(綠點),與實際側欄同一套判定 結果右欄
7 清除 回到指派表 搜尋框旁

不顯示規則字串、範圍、部門——管理員要的是「從哪個角色來、什麼時候失效」。

2. Use Case

UC-CHECK-01 查某人的實際權限

項目 內容
角色 持 iam.user.read
前置條件 對象是看得到的使用者
產出後置 唯讀,不寫資料
flowchart TD
  A["輸入姓名或帳號並選定"] --> B["GET /users/:uid/effective-access"]
  B --> C{"查的是本人?"}
  C -- 否 --> D{"持 iam.user.read?"}
  D -- 否 --> X["403 GRC_403022"]
  C -- 是 --> E
  D -- 是 --> E["只取當下有效指派<br/>(期間內、角色與帳號啟用、當前租戶)"]
  E --> F["展開每個角色的規則<br/>每項權限記下來源角色、規則、起訖"]
  F --> G{"有豁免旗標?"}
  G -- 是 --> H["上方顯示豁免說明"]
  G -- 否 --> I
  H --> I["左:權限表(依頁分組)<br/>右:POST /ui-routes/visible-by-capabilities 算可見選單"]

3. 權限矩陣

操作 FE 判定 BE 強制 BE 檢查位置
查他人 所在頁需 iam.user.read iam.user.read jedi-iam role_assignment_route.py(UserEffectiveAccessRoute.get)
查自己 — 放行 同上
可見選單 — iam.role.read ui_route_route.py(UiRoutesVisibleRoute)

查他人缺權限回 403 而不是 401:前端收到 401 會走登出。

4. 狀態機與前置條件

條件 效果
指派已到期、未生效、角色或帳號停用 不計入,不出現在表上
多個角色給同一項權限 一列,來源角色欄列出全部;到期 tooltip 逐一列出各來源

豁免說明三種(bypass):

旗標 畫面說明
super_admin 此帳號為超級管理員,所有功能不受角色限制。下方列出的是其角色所授予的權限,實際可使用的功能不限於此
platform_admin 此帳號為原廠管理員,部分原廠管理功能不受角色限制
is_admin 此帳號持有管理員角色,部分管理功能不受角色限制

系統管理員角色(*.*.*)展開後就是全部權限,表上會列滿;豁免說明另外說明「不受角色限制」的部分。

5. UI 設計

結果兩欄:左 8/12(豁免說明、摘要、依頁分組的權限表或空狀態),右 4/12(可見選單)。

📸 實機截圖待補(亮色模式):一般使用者結果、系統管理員(豁免說明)、沒有任何權限的空狀態。

6. API 規格

6.1 總清單

Method + Path 說明 守門
GET /api/1.0/users/<uid>/effective-access 某人每項有效權限的來源 查他人 iam.user.read
POST /api/1.0/ui-routes/visible-by-capabilities 給權限名清單回可見頁 iam.role.read
GET /api/1.0/users/menu 搜尋框人員清單 登入即可

6.2 effective-access 回應(EffectiveAccessResponse)

欄位 型別 說明
user_uid / login_name / nickname string
tenant_id int 以查詢者當下租戶計算
bypass object super_admin、platform_admin、is_admin 三個布林
capabilities[] list 每項有效權限
capabilities[].name / display_name / module / resource / verb string
capabilities[].sources[] list 來源:assignment_id、role_uid、role_name、pattern、scope、org_unit_id、org_unit_name、starts_at、ends_at

舊名別名不重複列:新名那列已涵蓋。出處:jedi-iam api/serializers/role_assignment.py、app/service/effective_access_service.py。

7. 前端檔案地圖(compliance-manager-fe/)

檔案 角色
src/views/access/CheckAccessBar.vue 搜尋框
src/views/access/EffectiveAccessView.vue 結果
src/composables/useEffectiveAccess.js 取資料、依頁分組
src/composables/useVisibleRoutes.js 可見選單
src/views/access/AssignmentManage.vue 所在頁(?check= 參數)

8. 後端檔案地圖

鏈路 Route Service 底層
檢查存取 jedi-iam role_assignment_route.py UserEffectiveAccessRoute jedi-iam effective_access_service.py user_role repo explain_active_capabilities(與判定同一條有效指派條件)

9. DB

唯讀:public.user_roles、public.roles、public.role_capability_patterns、public.capabilities、public.org_units。欄位見 指派 §9、角色明細 §9。

10. 頁面邏輯與資料對應

選人 → 寫入網址 check → 取 effective-access → 依頁分組(與角色明細同一套歸頁規則)→ 以權限名清單打可見選單。

11. 背景行為與外部依賴

無排程、無 socket;展開結果走 Redis 快取(與判定共用)。

12. 邊界情況與已知坑

  1. 以查詢者當下租戶計算:同一人在不同租戶有不同指派時,結果依管理員目前切換的租戶。
  2. 選單要重新登入才變:這裡看到的是「現在登入會看到的」選單;對方若沒重新登入,他畫面上的側欄可能還是舊的。

13. 開發與驗證