檢查存取(Check Access)¶
功能群:系統管理|權限模型先讀 功能群總覽 §2|所在頁:指派
事實基準:2026-10-08 從 FE
src/views/access/CheckAccessBar.vue、EffectiveAccessView.vue、src/composables/useEffectiveAccess.js+ jedi-iamrole_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. 邊界情況與已知坑¶
- 以查詢者當下租戶計算:同一人在不同租戶有不同指派時,結果依管理員目前切換的租戶。
- 選單要重新登入才變:這裡看到的是「現在登入會看到的」選單;對方若沒重新登入,他畫面上的側欄可能還是舊的。