[CLAUDE] Docs: S162 closeout - cay 4-folder GD ship prod + bookend-close 5 vong/10 vai
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 5m54s
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 5m54s
- Cay 4-folder giai doan duoi tung goi thau (bfc7b79, cicd PASS 5/5 Run #432)
- Bookend-close: H1 PASS_WITH_FLAGS · H2 GATE-FAIL 4 · H24 20 FLAG · trio MIXED
· ring1 26D/2T · ring2 19D/1T · harness-audit 43D/4T · ctx-audit TRUOT 7 FLAG
- Lead va trong phien: F-01/F-02/F-04 + A1 archive + A2 distill + skill KHKK
+ comment mirror self-ref (SHA-pair 6/6 giu, build x2 EXIT 0)
- MIND-5 = refresh @closeout dau tien (nhip thu 5, theo de ctx-audit)
- STATUS 3 row canonical + dong CURRENT · HANDOFF 6 slot danh so (54)-(59)
- gotcha #85 · error-ledger E-015/E-016 + AS-19/AS-20 · Phase 12 roadmap
- 4 errata khai thang: tally view-stale-count thoi 1 · enum thieu 1 class
· tong L1 lech 54 B · A2 tren trigger duong-gia (R10)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@ -1376,6 +1376,16 @@ for h in resp.points: # ← .points không phải iterable trực tiếp
|
||||
|
||||
---
|
||||
|
||||
### 85. Menu-key OR-gate FE ≠ policy per-action BE — gate rộng hơn endpoint ⇒ 403 rải khắp UI (Session 162)
|
||||
|
||||
**Triệu chứng (chưa kịp xảy ra trên prod — reviewer bắt trước ship):** cây 4-folder GĐ gate quyền GĐ2 bằng `['Khkk_List','Khkk_G1','KeHoachKyKet'].some(can)`, nhưng endpoint `/contract-signing-plans` gắn `[Authorize(Policy="KeHoachKyKet.Read")]` (`ContractSigningPlansController.cs:36`) và `MenuPermissionHandler.cs:40` **so khớp CHÍNH XÁC 1 key** — KHÔNG kế thừa cha, KHÔNG OR key con. ⇒ role có `Khkk_List=1` mà `KeHoachKyKet=0` sẽ: FE mở cổng → gọi API → **403** → folder GĐ2 hiện "—" **dưới MỌI gói thầu**, và claim "gate trước fetch ⇒ 0 rác 403" **vỡ**.
|
||||
|
||||
**Vì sao dễ mắc:** luật *"gate phải OR nhiều key"* là **ĐÚNG cho tầng HIỂN THỊ** — `GetMyMenuTreeQuery.cs:61-96` trả node khi `CanRead=true` **hoặc có con CanRead** nên root có thể tồn tại với `canRead=false`. Người viết mang nguyên luật đúng-ở-tầng-này sang **tầng API-authz** nơi nó sai. Đây là mặt thứ hai của #82 (menu-hiện ≠ API-mở); lần này là **menu-hiện rộng hơn API-cho**.
|
||||
|
||||
**Fix:** gate mỗi query bằng **đúng key policy của endpoint** (`['KeHoachKyKet']`). Endpoint chỉ có `[Authorize]` trần (`/contracts` — #82 còn treo có chủ đích) thì OR key hiển-thị **vô hại** vì không có policy per-action để đá. Trước khi wire gate: **mở controller đích đọc attribute**, đừng suy từ cây menu.
|
||||
|
||||
**Đo trước khi tin:** Dev DB 13/13 role đều có `Contracts=1 ∧ KeHoachKyKet=1` ⇒ ca này **chưa lộ**; nó chờ đúng 1 lần chỉnh ma-trận quyền. Lớp lỗi "chưa vỡ vì dữ-liệu hiện tại may mắn" phải vá ngay, không đợi triệu chứng.
|
||||
|
||||
## Checklist debug bug mới
|
||||
|
||||
1. Build pass không? → fail → check using + package version compat
|
||||
|
||||
Reference in New Issue
Block a user