Task 2-1: Audit Logging cho Auth Events
Phase: 2 - Observability Priority: Medium Module:
authenticationDepends on: Không có Reference:docs/BountyHunter-Backend/details/feature-authentication/SPEC.md
Background
Chưa có structured audit log cho các sự kiện auth quan trọng (login, ban, logout). Rất khó điều tra khi có incident bảo mật.
Tasks
DI / Import note:
LOGGERphải được khai báo là static field ở đầu mỗi class sử dụng nó. Nếu chưa có, thêm vàoAuthServicevàAuthController:Import:private static final org.slf4j.Logger LOGGER = org.slf4j.LoggerFactory.getLogger(AuthService.class);org.slf4j.Logger,org.slf4j.LoggerFactory. Các biến nhưloginType,ipAddress,isFirstLogin,userId,firebaseToken,deviceTypephải có sẵn trong scope của method tương ứng — xác nhận trước khi thêm log line.
- [ ] Thêm structured log khi user login thành công (userId, loginType, ipAddress, isFirstLogin)
- [ ] Log khi user bị chặn vì
NO_ACTIVEstatus - [ ] Log khi user logout (userId, firebaseToken)
- [ ] Log khi concurrent login detected (thiết bị mới)
Format log chuẩn:
// Login success
LOGGER.info("[AUTH_EVENT] action=LOGIN_SUCCESS userId={} loginType={} ip={} isFirstLogin={}",
user.getId(), loginType, ipAddress, isFirstLogin);
// Banned
LOGGER.warn("[AUTH_EVENT] action=LOGIN_BANNED userId={} loginType={}",
user.getId(), loginType);
// Logout
LOGGER.info("[AUTH_EVENT] action=LOGOUT userId={} firebaseToken={}",
userId, firebaseToken);
// New device
LOGGER.info("[AUTH_EVENT] action=NEW_DEVICE userId={} deviceType={}",
user.getId(), deviceType);
Verification / Acceptance Criteria
- [ ] Compile check:
AuthService.javavàAuthController.javacompile thành công —LOGGERđược khai báo trong mỗi class, importorg.slf4j.Loggervàorg.slf4j.LoggerFactorytồn tại. - [ ] Login success log: Thực hiện
sign-inthành công → log line[AUTH_EVENT] action=LOGIN_SUCCESSxuất hiện trong console/log file với đủ các fielduserId,loginType,ip,isFirstLogin. - [ ] Banned log:
sign-invới user cóstatus=NO_ACTIVE→ log line[AUTH_EVENT] action=LOGIN_BANNEDxuất hiện ở level WARN. - [ ] Logout log:
DELETE /api/auth/logout/{firebaseToken}→ log line[AUTH_EVENT] action=LOGOUTxuất hiện vớiuserIdvàfirebaseToken. - [ ] New device log: Login từ thiết bị mới → log line
[AUTH_EVENT] action=NEW_DEVICExuất hiện vớiuserIdvàdeviceType. - [ ] No sensitive data: Log không chứa password, JWT token, hay auth code.
Files to Modify
authentication/controllers/auth/AuthService.java— trongsignIn(),setLoginCodeResponse(),getLoginCodeResponse()authentication/controllers/auth/AuthController.java— tronglogoutFromDevice()