Lệch thiết kế mục 5 (đã ghi 3d #1): đọc auth từ payload JWT header (không kiểm chữ ký — dựa vào jwt_verify của starter và path không public); gọi ngoài thread request → rỗng → 500
KHỚP 8 / KHÁC 4 (đều có D-xx: D-08, D-02+D-09, D-02, D-03) / CHỈ CÓ Ở CŨ 0 / CHỈ CÓ Ở MỚI 0
không
JwtAuthorityClaimReader không tự kiểm chữ ký: chỉ an toàn khi giữ jwt_verify và path không public; nó cần RequestContextHolder, gọi ngoài thread request thì ra 500; ngày Instant còn UNVERIFIED (D-06)
3c. Nghi vấn bug / sai ở code cũ (đã GIỮ nguyên khi chuyển)
B-01 Xem được tồn theo lô của công ty khác
Mức nghi ngờ: CAO
Ở đâu: code cũ backend:service/impl/InventoryCheckingManagementServiceImpl.java:173-186 → code mới BatchQueryService.findInventoryCheckBatches
Code cũ đang làm gì: chỉ kiểm user có quyền kiểm kê (bất kỳ công ty nào) và kho thuộc comId gửi lên; không so comId với công ty đang đăng nhập.
Ví dụ cụ thể: nhân viên công ty 20 có quyền 3401 gọi ?comId=10&warehouseId=1&ppuId=55 → nhận danh sách lô và tồn của công ty 10.
Vì sao nghi là sai: lộ dữ liệu tồn kho giữa các khách hàng.
Ảnh hưởng nếu đúng là bug: đọc chéo dữ liệu.
Đã xử lý khi chuyển: GIỮ. Test khoá: TC-08 (a) (BatchQueryServiceTest$InventoryCheckBatches#companyFromParameter).
Nếu muốn sửa: gọi CurrentCompanyService.requireCompanyOfCurrentUser(comId) ở InventoryCheckBatchService.getBatches; đổi TC-08.
Liên quan: D-01, R-03
B-02 Claim quyền có mã trùng làm lỗi hệ thống
Mức nghi ngờ: THẤP
Ở đâu:backend:aop/CheckAuthorizeAspect.java (Set.of(authStr.split(","))) → BatchPermission
Code cũ đang làm gì: tập quyền dựng bằng Set.of, gặp phần tử trùng thì ném lỗi.
Ví dụ cụ thể: token có auth=",,3401" hoặc "3401,3401" → lỗi hệ thống dù có quyền.
Vì sao nghi là sai: dữ liệu quyền hợp lệ nhưng bị chặn.
Ảnh hưởng nếu đúng là bug: phụ thuộc cách phát token; hiếm.
Đã xử lý khi chuyển: GIỮ. Test khoá: TC-06 (InventoryCheckBatchServiceTest#duplicatedAuthorities).
Nếu muốn sửa: dùng new HashSet<>(Arrays.asList(...)); đổi TC-06.
Liên quan: D-04, R-02
B-03 Từ khoá không bỏ dấu, không escape
Mức nghi ngờ: THẤP
Ở đâu:base:repositories/impl/BaseInventoryCheckingQueryRepositoryImpl.java:142-151,176-178 → InventoryCheckBatchReader
Code cũ đang làm gì: chỉ trim + chữ thường, LIKE %k%.
Vòng 1 F-logic-1 (CRITICAL, parity, R-02): CONFIRMED (verify/round-1/verification.md) → ĐÃ SỬA ở fix 1.
5. Finding bị loại
Không có.
6. Xử lý của người
Vấn đề
Cổng
Chỉ thị
Chưa kiểm Sonar
G4
7. So với vòng trước
Vấn đề
Vòng trước
Vòng này
F-logic-1 (CRITICAL) claim auth luôn rỗng
MỚI
ĐÃ HẾT
8. Thay đổi trong repo đích
28 file (verify/round-2/changed-files.md): mới controller/DTO/service/reader/permission/JWT reader + 3 test mới; sửa BatchWebMapper, BatchQueryService, BatchRepository, BatchRelationalRepository, BatchErrorCode, WarehouseQueryService, WarehouseRepository, WarehouseRelationalRepository, CurrentUserPort, CurrentUserAdapter, i18n, 4 file test sẵn có.
9. Đề xuất bổ sung kinh nghiệm
Đề xuất
Đưa vào đâu
Starter BaseUserDTO.fromClaims bỏ claim auth (và các khoá dành riêng) khỏi getClaims(); chỉ có getUserAuthorities() đã trim/gộp. Kiểm quyền cần chuỗi gốc thì đọc payload JWT. Test phải dựng principal qua fromClaims hoặc header thật, không getClaims().put
target-cheatsheet.md mục 3; lessons.md 1b/1c
@CheckAuthorize (monolith) = AOP kiểm auth chứa một trong các mã — ghi thành LF để unit sau dùng
legacy-facts.md
Nguồn của trang này
Báo cáo sai lệchmigrations/batch/batches/report.mdvòng 2 · sha256 3b653d6b70f6
v1 dựng 2026-11-09 14:46 · base commit đích 661efe9b8c