Task 1-1: Guard CheatController với SUPER_ADMIN Role Only
Phase: 1 - Security Priority: Critical Module:
adminDepends on: Không có Reference: SPEC.md — xem mục 4 (ADM-F-02 RBAC) và mục 5 (Acceptance Criteria: "Admin với wrong role → 403")
Background
CheatController có endpoint addCoin cho phép thêm coin vào tài khoản user bất kỳ. Nếu bất kỳ admin nào có quyền gọi endpoint này, đây là rủi ro nghiêm trọng.
Tasks
File: admin/controller/cheat/CheatController.java
- [ ] Xác nhận annotation security hiện tại (có
@PreAuthorizekhông?) -
[ ] Thêm SUPER_ADMIN restriction:
@PreAuthorize("hasRole('SUPER_ADMIN')") @PostMapping("/add-coin") public Result<?> addCoin(@RequestBody AddCoinUserRequest request) { LOGGER.warn("[CHEAT_AUDIT] SUPER_ADMIN {} adding {} coin to userId={}", getCurrentAdminId(), request.getAmount(), request.getUserId()); // ... existing logic ... }Injection note:
getCurrentAdminId()phải được cung cấp bởi base controller class (ví dụBaseAdminController) hoặc injectSecurityContextHolder/AdminSecurityUtils. Kiểm tra xemCheatControllerextend base class nào, hoặc thêm helper method:private String getCurrentAdminId() { return ((AdminUserDetails) SecurityContextHolder.getContext() .getAuthentication().getPrincipal()).getAdminId(); } -
[ ] Verify
RoleEnum.SUPER_ADMINtồn tại và đúng admin accounts được assign - [ ] Thêm Slack notification khi endpoint được gọi:
slackNotificationService.sendAlert( "[CHEAT] addCoin called by admin=" + adminId + " userId=" + request.getUserId() + " amount=" + request.getAmount() );Injection note:
SlackNotificationServicephải được inject vàoCheatControllernếu chưa có:Xác nhận@Autowired private SlackNotificationService slackNotificationService;SlackNotificationServicetồn tại trong moduleadmin(searchSlackNotificationService.javatrongadmin/src). Nếu chỉ tồn tại ở module khác, cần thêm dependency hoặc tạo interface tương ứng.
Verification / Acceptance Criteria
- [ ] Code compiles:
CheatController.javakhông có import errors;SlackNotificationServicevàRoleEnum.SUPER_ADMINđều resolve đúng - [ ] HTTP 403 cho non-SUPER_ADMIN: Gọi
POST /api/admin/cheats/add-coinvới JWT của admin có roleOPERATORhoặcADMIN→ response403 Forbidden - [ ] HTTP 200 cho SUPER_ADMIN: Gọi cùng endpoint với JWT của SUPER_ADMIN → success
- [ ] Slack alert gửi: Sau mỗi lần
addCointhành công, Slack channel nhận message chứa adminId và userId - [ ] Audit log: Log line
[CHEAT_AUDIT]xuất hiện trong server logs với đúng adminId, amount, userId - [ ] Test class tham khảo:
CheatControllerTest(nếu tồn tại) — hoặc xemtask-3-2.mdcho integration test RBAC
Files to Modify
admin/controller/cheat/CheatController.java