From 05cf8281f2c87fcc512760dd4bf054416bfa6105 Mon Sep 17 00:00:00 2001 From: sdw086 Date: Thu, 21 May 2026 16:56:04 +0900 Subject: [PATCH] =?UTF-8?q?[api]=20AdminAuthController=20=EC=9D=B4?= =?UTF-8?q?=EC=AA=BD=20=EC=BB=A8=EB=B2=A4=EC=85=98=20=EB=A7=9E=EC=B6=B0=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/code-conventions.md | 2 + .../admin/auth/AdminAuthController.java | 98 ++++++------ ...nDto.java => AdminAuthApiKeyLoginDto.java} | 2 +- ...inLoginDto.java => AdminAuthLoginDto.java} | 2 +- ...orm.java => AdminAuthApiKeyLoginForm.java} | 12 +- ...LoginForm.java => AdminAuthLoginForm.java} | 14 +- .../admin/auth/mapper/AdminAuthMapper.java | 20 +-- .../admin/auth/service/AdminAuthService.java | 147 +++++++++--------- ...ginVo.java => AdminAuthApiKeyLoginVo.java} | 2 +- .../auth/vo/AdminAuthLoginCheckedVo.java | 34 ++++ ...dminLoginVo.java => AdminAuthLoginVo.java} | 4 +- .../admin/auth/vo/AdminAuthLogoutVo.java | 13 ++ .../admin/auth/vo/AdminAuthRefreshVo.java | 13 ++ ...minLoginMapper.xml => AdminAuthMapper.xml} | 122 ++++++++------- 14 files changed, 278 insertions(+), 207 deletions(-) rename src/main/java/com/alist/api/modules/admin/auth/dto/{AdminApiKeyLoginDto.java => AdminAuthApiKeyLoginDto.java} (88%) rename src/main/java/com/alist/api/modules/admin/auth/dto/{AdminLoginDto.java => AdminAuthLoginDto.java} (90%) rename src/main/java/com/alist/api/modules/admin/auth/form/{AdminApiKeyLoginForm.java => AdminAuthApiKeyLoginForm.java} (61%) rename src/main/java/com/alist/api/modules/admin/auth/form/{AdminLoginForm.java => AdminAuthLoginForm.java} (69%) rename src/main/java/com/alist/api/modules/admin/auth/vo/{AdminApiKeyLoginVo.java => AdminAuthApiKeyLoginVo.java} (96%) create mode 100644 src/main/java/com/alist/api/modules/admin/auth/vo/AdminAuthLoginCheckedVo.java rename src/main/java/com/alist/api/modules/admin/auth/vo/{AdminLoginVo.java => AdminAuthLoginVo.java} (94%) create mode 100644 src/main/java/com/alist/api/modules/admin/auth/vo/AdminAuthLogoutVo.java create mode 100644 src/main/java/com/alist/api/modules/admin/auth/vo/AdminAuthRefreshVo.java rename src/main/resources/mapper/admin/auth/{AdminLoginMapper.xml => AdminAuthMapper.xml} (62%) diff --git a/docs/code-conventions.md b/docs/code-conventions.md index da0b607..1b5ab6c 100644 --- a/docs/code-conventions.md +++ b/docs/code-conventions.md @@ -23,6 +23,8 @@ - DTO 안에 연관된 다른 DTO 변환이 꼭 필요할 때만 최소한의 보조 메서드를 둔다. - 외부 응답에 노출되면 안 되는 내부 필드는 응답에 사용될 수 있는 객체에서 `@JsonIgnore`로 숨긴다. - 등록, 수정, 삭제, 상태 변경처럼 처리 여부만 반환하는 VO 의 boolean 필드는 `processed` 로 통일한다. 예: `private boolean processed;` +- Controller 요청/응답 타입은 가능한 한 Form/Dto/Vo 로 명시한다. `Map` 는 응답 구조가 고정되지 않는 임시 디버깅, 외부 라이브러리 passthrough 같은 예외 상황에서만 제한적으로 사용한다. +- 응답 필드가 단순 boolean 몇 개뿐이어도 운영 API 에서는 VO 를 만든다. 예: 로그인 상태 확인 응답은 `Map` 보다 `AdminAuthLoginCheckedVo` 를 사용한다. - 목록 조회 API 는 특별한 사유가 없으면 기본적으로 페이징을 적용하고, 목록 조회 Form/Dto 는 `PageRequest`, 목록 응답 Vo 는 `PageResponse` 를 상속한다. ## Swagger/OpenAPI 문서화 규칙 diff --git a/src/main/java/com/alist/api/modules/admin/auth/AdminAuthController.java b/src/main/java/com/alist/api/modules/admin/auth/AdminAuthController.java index 8e0ef4a..ed08a52 100644 --- a/src/main/java/com/alist/api/modules/admin/auth/AdminAuthController.java +++ b/src/main/java/com/alist/api/modules/admin/auth/AdminAuthController.java @@ -4,11 +4,10 @@ import com.alist.api.common.response.ApiResponse; import com.alist.api.common.response.ApiResponseCode; import com.alist.api.common.utils.SecurityUtil; import com.alist.api.common.utils.SessionUtil; -import com.alist.api.modules.admin.auth.form.AdminApiKeyLoginForm; -import com.alist.api.modules.admin.auth.form.AdminLoginForm; +import com.alist.api.modules.admin.auth.form.AdminAuthApiKeyLoginForm; +import com.alist.api.modules.admin.auth.form.AdminAuthLoginForm; import com.alist.api.modules.admin.auth.service.AdminAuthService; -import com.alist.api.modules.admin.auth.vo.AdminApiKeyLoginVo; -import com.alist.api.modules.admin.auth.vo.AdminLoginVo; +import com.alist.api.modules.admin.auth.vo.*; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; @@ -17,9 +16,6 @@ import jakarta.validation.Valid; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import java.util.HashMap; -import java.util.Map; - @Tag( name = "501. Admin 로그인" , description = "ADMIN 사이트 로그인입니다. 로그인시 토큰 발급이 함께됩니다." @@ -39,34 +35,34 @@ public class AdminAuthController { , description = "admin로그인 sso와 다르게 로그인시 토큰이 함께 발급됩니다." ) @PostMapping("/login") - public ResponseEntity> adminLogin( - @Valid @RequestBody AdminLoginForm adminLoginForm + public ResponseEntity> adminAuthLogin( + @Valid @RequestBody AdminAuthLoginForm adminAuthLoginForm , HttpServletResponse response ) { - AdminLoginVo result = adminAuthService.adminLogin(adminLoginForm.toAdminLoginDto(), response); + AdminAuthLoginVo adminAuthLoginVo = adminAuthService.selectAdminAuthLogin(adminAuthLoginForm.toDto(), response); - if (result.getResultCode() == 2003) { - return ApiResponse.entity(result, ApiResponseCode.CODE_2003); + if (adminAuthLoginVo.getResultCode() == 2003) { + return ApiResponse.entity(adminAuthLoginVo, ApiResponseCode.CODE_2003); } - return ApiResponse.entity(result, ApiResponseCode.CODE_2001, "관리자 로그인"); + return ApiResponse.entity(adminAuthLoginVo, ApiResponseCode.CODE_2001, "관리자 로그인"); } @Operation( - summary = "admin API Key 로그인", - description = "Admin API Key로 인증하고 JSON으로 토큰을 반환합니다. Swagger 테스트용입니다." + summary = "admin API Key 로그인" + , description = "Admin API Key로 인증하고 JSON으로 토큰을 반환합니다. Swagger 테스트용입니다." ) @PostMapping("/apiKeyLogin") - public ResponseEntity> adminApiKeyLogin( - @Valid @RequestBody AdminApiKeyLoginForm adminApiKeyLoginForm + public ResponseEntity> adminAuthApiKeyLogin( + @Valid @RequestBody AdminAuthApiKeyLoginForm adminAuthApiKeyLoginForm ) { - AdminApiKeyLoginVo result = adminAuthService.adminApiKeyLogin(adminApiKeyLoginForm.toAdminApiKeyLoginDto()); + AdminAuthApiKeyLoginVo adminAuthApiKeyLoginVo = adminAuthService.selectAdminAuthApiKeyLogin(adminAuthApiKeyLoginForm.toDto()); - if (result.getResultCode() == 2003) { - return ApiResponse.entity(result, ApiResponseCode.CODE_2003); + if (adminAuthApiKeyLoginVo.getResultCode() == 2003) { + return ApiResponse.entity(adminAuthApiKeyLoginVo, ApiResponseCode.CODE_2003); } - return ApiResponse.entity(result, ApiResponseCode.CODE_2001, "관리자 엑세스 토큰"); + return ApiResponse.entity(adminAuthApiKeyLoginVo, ApiResponseCode.CODE_2001, "관리자 엑세스 토큰"); } @Operation( @@ -74,57 +70,60 @@ public class AdminAuthController { , description = "엑세스 토큰 만료시 리프레시 토큰 발급 용도 api 입니다." ) @PostMapping("/refresh") - public ResponseEntity>> refresh( + public ResponseEntity> adminAuthRefresh( @CookieValue(name = "adminRefreshToken", required = false) String refreshToken , HttpServletResponse response ) { - AdminLoginVo result = adminAuthService.adminRefresh(refreshToken, response); + AdminAuthLoginVo adminAuthLoginVo = adminAuthService.selectAdminAuthRefresh(refreshToken, response); - if (result == null) { - return ApiResponse.entity(Map.of("refreshed", false), ApiResponseCode.CODE_401); + AdminAuthRefreshVo adminAuthRefreshVo = new AdminAuthRefreshVo(); + adminAuthRefreshVo.setRefreshed(adminAuthLoginVo != null); + + if (adminAuthLoginVo == null) { + return ApiResponse.entity(adminAuthRefreshVo, ApiResponseCode.CODE_401); } - return ApiResponse.entity(Map.of("refreshed", true), ApiResponseCode.CODE_200); + return ApiResponse.entity(adminAuthRefreshVo, ApiResponseCode.CODE_200); } @Operation( - summary = "admin 로그인 상태 확인", - description = "admin 쿠키 기준으로 현재 공통 로그인 상태가 유효한지 확인하고, access/refresh 토큰 존재 여부도 함께 반환합니다." + summary = "admin 로그인 상태 확인" + , description = "admin 쿠키 기준으로 현재 공통 로그인 상태가 유효한지 확인하고, access/refresh 토큰 존재 여부도 함께 반환합니다." ) @GetMapping("/loginChecked") - public ResponseEntity>> loginChecked( + public ResponseEntity> adminAuthLoginChecked( HttpServletRequest request ) { - Map result = new HashMap<>(); + AdminAuthLoginCheckedVo adminAuthLoginCheckedVo = new AdminAuthLoginCheckedVo(); String accessToken = SessionUtil.resolveSsoCookieValue(request, "adminAccessToken"); String refreshToken = SessionUtil.resolveSsoCookieValue(request, "adminRefreshToken"); - result.put("isAdminAccessToken", accessToken != null && !accessToken.trim().isEmpty()); - result.put("isAdminRefreshToken", refreshToken != null && !refreshToken.trim().isEmpty()); + adminAuthLoginCheckedVo.setAdminAccessToken(accessToken != null && !accessToken.trim().isEmpty()); + adminAuthLoginCheckedVo.setAdminRefreshToken(refreshToken != null && !refreshToken.trim().isEmpty()); Integer userTokenIdx = SecurityUtil.getLoginUserTokenIdx(); if (userTokenIdx == null) { - result.put("loggedIn", false); - return ApiResponse.entity(result, ApiResponseCode.CODE_200); + adminAuthLoginCheckedVo.setLoggedIn(false); + return ApiResponse.entity(adminAuthLoginCheckedVo, ApiResponseCode.CODE_200); } - AdminLoginVo admin = adminAuthService.selectAdminTokenByUserTokenIdx(userTokenIdx); + AdminAuthLoginVo adminAuthLoginVo = adminAuthService.selectAdminAuthLoginChecked(userTokenIdx); - if (admin == null) { - result.put("loggedIn", false); - return ApiResponse.entity(result, ApiResponseCode.CODE_200); + if (adminAuthLoginVo == null) { + adminAuthLoginCheckedVo.setLoggedIn(false); + return ApiResponse.entity(adminAuthLoginCheckedVo, ApiResponseCode.CODE_200); } - result.put("loggedIn", true); - result.put("userId", admin.getId()); - result.put("userIdx", admin.getUserIdx()); - result.put("userTokenIdx", userTokenIdx); - result.put("userRole", admin.getUserRole()); - result.put("userType", admin.getUserType()); + adminAuthLoginCheckedVo.setLoggedIn(true); + adminAuthLoginCheckedVo.setUserId(adminAuthLoginVo.getId()); + adminAuthLoginCheckedVo.setUserIdx(adminAuthLoginVo.getUserIdx()); + adminAuthLoginCheckedVo.setUserTokenIdx(userTokenIdx); + adminAuthLoginCheckedVo.setUserRole(adminAuthLoginVo.getUserRole()); + adminAuthLoginCheckedVo.setUserType(adminAuthLoginVo.getUserType()); - return ApiResponse.entity(result, ApiResponseCode.CODE_200); + return ApiResponse.entity(adminAuthLoginCheckedVo, ApiResponseCode.CODE_200); } @Operation( @@ -132,12 +131,15 @@ public class AdminAuthController { , description = "admin 로그아웃" ) @PostMapping("/logout") - public ResponseEntity>> logout( + public ResponseEntity> adminAuthLogout( @CookieValue(name = "adminRefreshToken", required = false) String refreshToken , HttpServletResponse response ) { - adminAuthService.adminLogout(refreshToken, response); + adminAuthService.updateAdminAuthLogout(refreshToken, response); - return ApiResponse.entity(Map.of("loggedOut", true), ApiResponseCode.CODE_200); + AdminAuthLogoutVo adminAuthLogoutVo = new AdminAuthLogoutVo(); + adminAuthLogoutVo.setLoggedOut(true); + + return ApiResponse.entity(adminAuthLogoutVo, ApiResponseCode.CODE_200); } } diff --git a/src/main/java/com/alist/api/modules/admin/auth/dto/AdminApiKeyLoginDto.java b/src/main/java/com/alist/api/modules/admin/auth/dto/AdminAuthApiKeyLoginDto.java similarity index 88% rename from src/main/java/com/alist/api/modules/admin/auth/dto/AdminApiKeyLoginDto.java rename to src/main/java/com/alist/api/modules/admin/auth/dto/AdminAuthApiKeyLoginDto.java index a456d72..fe86e2b 100644 --- a/src/main/java/com/alist/api/modules/admin/auth/dto/AdminApiKeyLoginDto.java +++ b/src/main/java/com/alist/api/modules/admin/auth/dto/AdminAuthApiKeyLoginDto.java @@ -7,7 +7,7 @@ import java.time.Instant; @Getter @Setter -public class AdminApiKeyLoginDto { +public class AdminAuthApiKeyLoginDto { private String userApiKey; private Integer userIdx; private Integer userTokenIdx; diff --git a/src/main/java/com/alist/api/modules/admin/auth/dto/AdminLoginDto.java b/src/main/java/com/alist/api/modules/admin/auth/dto/AdminAuthLoginDto.java similarity index 90% rename from src/main/java/com/alist/api/modules/admin/auth/dto/AdminLoginDto.java rename to src/main/java/com/alist/api/modules/admin/auth/dto/AdminAuthLoginDto.java index 0788d5a..efb85f8 100644 --- a/src/main/java/com/alist/api/modules/admin/auth/dto/AdminLoginDto.java +++ b/src/main/java/com/alist/api/modules/admin/auth/dto/AdminAuthLoginDto.java @@ -7,7 +7,7 @@ import java.time.Instant; @Setter @Getter -public class AdminLoginDto { +public class AdminAuthLoginDto { private String id; private String password; diff --git a/src/main/java/com/alist/api/modules/admin/auth/form/AdminApiKeyLoginForm.java b/src/main/java/com/alist/api/modules/admin/auth/form/AdminAuthApiKeyLoginForm.java similarity index 61% rename from src/main/java/com/alist/api/modules/admin/auth/form/AdminApiKeyLoginForm.java rename to src/main/java/com/alist/api/modules/admin/auth/form/AdminAuthApiKeyLoginForm.java index 15637a5..9c01196 100644 --- a/src/main/java/com/alist/api/modules/admin/auth/form/AdminApiKeyLoginForm.java +++ b/src/main/java/com/alist/api/modules/admin/auth/form/AdminAuthApiKeyLoginForm.java @@ -1,6 +1,6 @@ package com.alist.api.modules.admin.auth.form; -import com.alist.api.modules.admin.auth.dto.AdminApiKeyLoginDto; +import com.alist.api.modules.admin.auth.dto.AdminAuthApiKeyLoginDto; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; import lombok.Getter; @@ -9,7 +9,7 @@ import lombok.Setter; @Schema(description = "Admin API Key 로그인 요청 폼") @Getter @Setter -public class AdminApiKeyLoginForm { +public class AdminAuthApiKeyLoginForm { @Schema( description = "Admin API Key", example = "ypdz9hl7WAp2D03HC5h9koEC49R6LAkLSuoSdgEwVQA", @@ -18,9 +18,9 @@ public class AdminApiKeyLoginForm { @NotBlank(message = "apiKey를 입력해주세요.") private String userApiKey; - public AdminApiKeyLoginDto toAdminApiKeyLoginDto() { - AdminApiKeyLoginDto adminApiKeyLoginDto = new AdminApiKeyLoginDto(); - adminApiKeyLoginDto.setUserApiKey(userApiKey.trim()); - return adminApiKeyLoginDto; + public AdminAuthApiKeyLoginDto toDto() { + AdminAuthApiKeyLoginDto adminAuthApiKeyLoginDto = new AdminAuthApiKeyLoginDto(); + adminAuthApiKeyLoginDto.setUserApiKey(userApiKey.trim()); + return adminAuthApiKeyLoginDto; } } diff --git a/src/main/java/com/alist/api/modules/admin/auth/form/AdminLoginForm.java b/src/main/java/com/alist/api/modules/admin/auth/form/AdminAuthLoginForm.java similarity index 69% rename from src/main/java/com/alist/api/modules/admin/auth/form/AdminLoginForm.java rename to src/main/java/com/alist/api/modules/admin/auth/form/AdminAuthLoginForm.java index 8d513bf..1460b88 100644 --- a/src/main/java/com/alist/api/modules/admin/auth/form/AdminLoginForm.java +++ b/src/main/java/com/alist/api/modules/admin/auth/form/AdminAuthLoginForm.java @@ -1,6 +1,6 @@ package com.alist.api.modules.admin.auth.form; -import com.alist.api.modules.admin.auth.dto.AdminLoginDto; +import com.alist.api.modules.admin.auth.dto.AdminAuthLoginDto; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; import lombok.Getter; @@ -9,7 +9,7 @@ import lombok.Setter; @Schema(description = "Admin 로그인 요청 폼") @Getter @Setter -public class AdminLoginForm { +public class AdminAuthLoginForm { @Schema( description = "관리자 아이디", example = "admin", @@ -26,11 +26,11 @@ public class AdminLoginForm { @NotBlank(message = "비밀번호는 필수입니다.") private String password; - public AdminLoginDto toAdminLoginDto() { - AdminLoginDto adminLoginDto = new AdminLoginDto(); - adminLoginDto.setId(id.trim()); - adminLoginDto.setPassword(password); + public AdminAuthLoginDto toDto() { + AdminAuthLoginDto adminAuthLoginDto = new AdminAuthLoginDto(); + adminAuthLoginDto.setId(id.trim()); + adminAuthLoginDto.setPassword(password); - return adminLoginDto; + return adminAuthLoginDto; } } diff --git a/src/main/java/com/alist/api/modules/admin/auth/mapper/AdminAuthMapper.java b/src/main/java/com/alist/api/modules/admin/auth/mapper/AdminAuthMapper.java index 84d5450..b551af6 100644 --- a/src/main/java/com/alist/api/modules/admin/auth/mapper/AdminAuthMapper.java +++ b/src/main/java/com/alist/api/modules/admin/auth/mapper/AdminAuthMapper.java @@ -1,24 +1,24 @@ package com.alist.api.modules.admin.auth.mapper; -import com.alist.api.modules.admin.auth.dto.AdminApiKeyLoginDto; -import com.alist.api.modules.admin.auth.dto.AdminLoginDto; -import com.alist.api.modules.admin.auth.vo.AdminApiKeyLoginVo; -import com.alist.api.modules.admin.auth.vo.AdminLoginVo; +import com.alist.api.modules.admin.auth.dto.AdminAuthApiKeyLoginDto; +import com.alist.api.modules.admin.auth.dto.AdminAuthLoginDto; +import com.alist.api.modules.admin.auth.vo.AdminAuthApiKeyLoginVo; +import com.alist.api.modules.admin.auth.vo.AdminAuthLoginVo; import org.apache.ibatis.annotations.Mapper; @Mapper public interface AdminAuthMapper { - AdminLoginVo selectAdminLoginById(String id); + AdminAuthLoginVo selectAdminAuthLogin(String id); - void updateAdminRefreshToken(AdminLoginDto adminLoginDto); + void updateAdminRefreshToken(AdminAuthLoginDto adminAuthLoginDto); void updateAdminLastLoginAt(Integer userIdx); - AdminLoginVo selectAdminTokenByUserTokenIdx(Integer userTokenIdx); + AdminAuthLoginVo selectAdminTokenByUserTokenIdx(Integer userTokenIdx); - void clearAdminRefreshToken(Integer userTokenIdx); + void updateClearAdminRefreshToken(Integer userTokenIdx); - AdminApiKeyLoginVo selectAdminApiKeyLogin(AdminApiKeyLoginDto adminApiKeyLoginDto); + AdminAuthApiKeyLoginVo selectAdminAuthApiKeyLogin(AdminAuthApiKeyLoginDto adminAuthApiKeyLoginDto); - void updateAdminApiKeyLoginRefreshToken(AdminApiKeyLoginDto adminApiKeyLoginDto); + void updateAdminApiKeyLoginRefreshToken(AdminAuthApiKeyLoginDto adminAuthApiKeyLoginDto); } diff --git a/src/main/java/com/alist/api/modules/admin/auth/service/AdminAuthService.java b/src/main/java/com/alist/api/modules/admin/auth/service/AdminAuthService.java index b04ff14..aa6eab7 100644 --- a/src/main/java/com/alist/api/modules/admin/auth/service/AdminAuthService.java +++ b/src/main/java/com/alist/api/modules/admin/auth/service/AdminAuthService.java @@ -2,11 +2,11 @@ package com.alist.api.modules.admin.auth.service; import com.alist.api.common.utils.SessionUtil; import com.alist.api.config.jwt.JwtTokenProvider; -import com.alist.api.modules.admin.auth.dto.AdminApiKeyLoginDto; -import com.alist.api.modules.admin.auth.dto.AdminLoginDto; +import com.alist.api.modules.admin.auth.dto.AdminAuthApiKeyLoginDto; +import com.alist.api.modules.admin.auth.dto.AdminAuthLoginDto; import com.alist.api.modules.admin.auth.mapper.AdminAuthMapper; -import com.alist.api.modules.admin.auth.vo.AdminApiKeyLoginVo; -import com.alist.api.modules.admin.auth.vo.AdminLoginVo; +import com.alist.api.modules.admin.auth.vo.AdminAuthApiKeyLoginVo; +import com.alist.api.modules.admin.auth.vo.AdminAuthLoginVo; import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Value; import org.springframework.security.crypto.password.PasswordEncoder; @@ -43,42 +43,72 @@ public class AdminAuthService { } @Transactional - public AdminLoginVo adminLogin(AdminLoginDto adminLoginDto, HttpServletResponse response) { - AdminLoginVo result = new AdminLoginVo(); - AdminLoginVo adminLoginVo = adminAuthMapper.selectAdminLoginById(adminLoginDto.getId()); + public AdminAuthLoginVo selectAdminAuthLogin(AdminAuthLoginDto adminAuthLoginDto, HttpServletResponse response) { + AdminAuthLoginVo adminAuthLoginVo = adminAuthMapper.selectAdminAuthLogin(adminAuthLoginDto.getId()); - if (adminLoginVo == null) { - result.setResultCode(2003); - result.setLogin(false); - return result; + if (adminAuthLoginVo == null) { + AdminAuthLoginVo adminAuthLoginVo1 = new AdminAuthLoginVo(); + adminAuthLoginVo1.setResultCode(2003); + adminAuthLoginVo1.setLogin(false); + return adminAuthLoginVo1; } - if (!passwordEncoder.matches(adminLoginDto.getPassword(), adminLoginVo.getPassword())) { - result.setResultCode(2003); - result.setLogin(false); - return result; + if (!passwordEncoder.matches(adminAuthLoginDto.getPassword(), adminAuthLoginVo.getPassword())) { + AdminAuthLoginVo adminAuthLoginVo1 = new AdminAuthLoginVo(); + adminAuthLoginVo1.setResultCode(2003); + adminAuthLoginVo1.setLogin(false); + return adminAuthLoginVo1; } - String accessToken = jwtTokenProvider.createAdminAccessToken(adminLoginVo.getUserTokenIdx()); - String refreshToken = jwtTokenProvider.createAdminRefreshToken(adminLoginVo.getUserTokenIdx()); + String accessToken = jwtTokenProvider.createAdminAccessToken(adminAuthLoginVo.getUserTokenIdx()); + String refreshToken = jwtTokenProvider.createAdminRefreshToken(adminAuthLoginVo.getUserTokenIdx()); - adminLoginDto.setUserIdx(adminLoginVo.getUserIdx()); - adminLoginDto.setUserTokenIdx(adminLoginVo.getUserTokenIdx()); - adminLoginDto.setRefreshToken(refreshToken); - adminLoginDto.setExpiresAt(Instant.now().plusSeconds(refreshTokenValiditySeconds)); + adminAuthLoginDto.setUserIdx(adminAuthLoginVo.getUserIdx()); + adminAuthLoginDto.setUserTokenIdx(adminAuthLoginVo.getUserTokenIdx()); + adminAuthLoginDto.setRefreshToken(refreshToken); + adminAuthLoginDto.setExpiresAt(Instant.now().plusSeconds(refreshTokenValiditySeconds)); - adminAuthMapper.updateAdminRefreshToken(adminLoginDto); - adminAuthMapper.updateAdminLastLoginAt(adminLoginDto.getUserIdx()); + adminAuthMapper.updateAdminRefreshToken(adminAuthLoginDto); + adminAuthMapper.updateAdminLastLoginAt(adminAuthLoginDto.getUserIdx()); - SessionUtil.addTokenCookie(response,"adminAccessToken", accessToken, cookieDomain, cookieSecure, cookieSameSite, accessTokenValiditySeconds); - SessionUtil.addTokenCookie(response,"adminRefreshToken", refreshToken, cookieDomain, cookieSecure, cookieSameSite, refreshTokenValiditySeconds); + SessionUtil.addTokenCookie(response, "adminAccessToken", accessToken, cookieDomain, cookieSecure, cookieSameSite, accessTokenValiditySeconds); + SessionUtil.addTokenCookie(response, "adminRefreshToken", refreshToken, cookieDomain, cookieSecure, cookieSameSite, refreshTokenValiditySeconds); - adminLoginVo.setResultCode(2001); - adminLoginVo.setLogin(true); - return adminLoginVo; + adminAuthLoginVo.setResultCode(2001); + adminAuthLoginVo.setLogin(true); + return adminAuthLoginVo; } - public AdminLoginVo adminRefresh(String refreshToken, HttpServletResponse response) { + @Transactional + public AdminAuthApiKeyLoginVo selectAdminAuthApiKeyLogin(AdminAuthApiKeyLoginDto adminAuthApiKeyLoginDto) { + AdminAuthApiKeyLoginVo adminAuthApiKeyLoginVo = adminAuthMapper.selectAdminAuthApiKeyLogin(adminAuthApiKeyLoginDto); + + if (adminAuthApiKeyLoginVo == null) { + AdminAuthApiKeyLoginVo adminAuthApiKeyLoginVo1 = new AdminAuthApiKeyLoginVo(); + adminAuthApiKeyLoginVo1.setResultCode(2003); + adminAuthApiKeyLoginVo1.setLogin(false); + return adminAuthApiKeyLoginVo1; + } + + String accessToken = jwtTokenProvider.createAdminAccessToken(adminAuthApiKeyLoginVo.getUserTokenIdx()); + String refreshToken = jwtTokenProvider.createAdminRefreshToken(adminAuthApiKeyLoginVo.getUserTokenIdx()); + + adminAuthApiKeyLoginDto.setUserTokenIdx(adminAuthApiKeyLoginVo.getUserTokenIdx()); + adminAuthApiKeyLoginDto.setRefreshToken(refreshToken); + adminAuthApiKeyLoginDto.setExpiresAt(Instant.now().plusSeconds(refreshTokenValiditySeconds)); + + adminAuthMapper.updateAdminApiKeyLoginRefreshToken(adminAuthApiKeyLoginDto); + adminAuthMapper.updateAdminLastLoginAt(adminAuthApiKeyLoginVo.getUserIdx()); + + adminAuthApiKeyLoginVo.setAccessToken(accessToken); + adminAuthApiKeyLoginVo.setRefreshToken(refreshToken); + adminAuthApiKeyLoginVo.setResultCode(2001); + adminAuthApiKeyLoginVo.setLogin(true); + + return adminAuthApiKeyLoginVo; + } + + public AdminAuthLoginVo selectAdminAuthRefresh(String refreshToken, HttpServletResponse response) { if (refreshToken == null || !jwtTokenProvider.validateToken(refreshToken)) { return null; } @@ -99,41 +129,41 @@ public class AdminAuthService { return null; } - AdminLoginVo adminToken = adminAuthMapper.selectAdminTokenByUserTokenIdx(userTokenIdx); - if (adminToken == null || adminToken.getRefreshToken() == null) { + AdminAuthLoginVo adminAuthLoginVo = adminAuthMapper.selectAdminTokenByUserTokenIdx(userTokenIdx); + if (adminAuthLoginVo == null || adminAuthLoginVo.getRefreshToken() == null) { return null; } - if (!refreshToken.equals(adminToken.getRefreshToken())) { + if (!refreshToken.equals(adminAuthLoginVo.getRefreshToken())) { return null; } String newAccessToken = jwtTokenProvider.createAdminAccessToken(userTokenIdx); String newRefreshToken = jwtTokenProvider.createAdminRefreshToken(userTokenIdx); - AdminLoginDto adminLoginDto = new AdminLoginDto(); + AdminAuthLoginDto adminAuthLoginDto = new AdminAuthLoginDto(); - adminLoginDto.setUserTokenIdx(userTokenIdx); - adminLoginDto.setRefreshToken(newRefreshToken); - adminLoginDto.setExpiresAt(Instant.now().plusSeconds(refreshTokenValiditySeconds)); + adminAuthLoginDto.setUserTokenIdx(userTokenIdx); + adminAuthLoginDto.setRefreshToken(newRefreshToken); + adminAuthLoginDto.setExpiresAt(Instant.now().plusSeconds(refreshTokenValiditySeconds)); - adminAuthMapper.updateAdminRefreshToken(adminLoginDto); + adminAuthMapper.updateAdminRefreshToken(adminAuthLoginDto); SessionUtil.addTokenCookie(response, "adminAccessToken", newAccessToken, cookieDomain, cookieSecure, cookieSameSite, accessTokenValiditySeconds); SessionUtil.addTokenCookie(response, "adminRefreshToken", newRefreshToken, cookieDomain, cookieSecure, cookieSameSite, refreshTokenValiditySeconds); - adminToken.setResultCode(2001); - return adminToken; + adminAuthLoginVo.setResultCode(2001); + return adminAuthLoginVo; } - public void adminLogout(String refreshToken, HttpServletResponse response) { - clearAdminRefreshToken(refreshToken); + public void updateAdminAuthLogout(String refreshToken, HttpServletResponse response) { + updateClearAdminRefreshToken(refreshToken); SessionUtil.expireCookie(response, "adminAccessToken", cookieDomain, cookieSecure, cookieSameSite); SessionUtil.expireCookie(response, "adminRefreshToken", cookieDomain, cookieSecure, cookieSameSite); } - private void clearAdminRefreshToken(String refreshToken) { + private void updateClearAdminRefreshToken(String refreshToken) { if (refreshToken == null || !jwtTokenProvider.validateToken(refreshToken)) { return; } @@ -148,45 +178,16 @@ public class AdminAuthService { try { Integer userTokenIdx = Integer.parseInt(jwtTokenProvider.getUserTokenIdx(refreshToken)); - adminAuthMapper.clearAdminRefreshToken(userTokenIdx); + adminAuthMapper.updateClearAdminRefreshToken(userTokenIdx); } catch (NumberFormatException ignored) { } } - public AdminLoginVo selectAdminTokenByUserTokenIdx(Integer userTokenIdx) { + public AdminAuthLoginVo selectAdminAuthLoginChecked(Integer userTokenIdx) { if (userTokenIdx == null) { return null; } return adminAuthMapper.selectAdminTokenByUserTokenIdx(userTokenIdx); } - - @Transactional - public AdminApiKeyLoginVo adminApiKeyLogin(AdminApiKeyLoginDto adminApiKeyLoginDto) { - AdminApiKeyLoginVo result = adminAuthMapper.selectAdminApiKeyLogin(adminApiKeyLoginDto); - - if (result == null) { - AdminApiKeyLoginVo empty = new AdminApiKeyLoginVo(); - empty.setResultCode(2003); - empty.setLogin(false); - return empty; - } - - String accessToken = jwtTokenProvider.createAdminAccessToken(result.getUserTokenIdx()); - String refreshToken = jwtTokenProvider.createAdminRefreshToken(result.getUserTokenIdx()); - - adminApiKeyLoginDto.setUserTokenIdx(result.getUserTokenIdx()); - adminApiKeyLoginDto.setRefreshToken(refreshToken); - adminApiKeyLoginDto.setExpiresAt(Instant.now().plusSeconds(refreshTokenValiditySeconds)); - - adminAuthMapper.updateAdminApiKeyLoginRefreshToken(adminApiKeyLoginDto); - adminAuthMapper.updateAdminLastLoginAt(result.getUserIdx()); - - result.setAccessToken(accessToken); - result.setRefreshToken(refreshToken); - result.setResultCode(2001); - result.setLogin(true); - - return result; - } } diff --git a/src/main/java/com/alist/api/modules/admin/auth/vo/AdminApiKeyLoginVo.java b/src/main/java/com/alist/api/modules/admin/auth/vo/AdminAuthApiKeyLoginVo.java similarity index 96% rename from src/main/java/com/alist/api/modules/admin/auth/vo/AdminApiKeyLoginVo.java rename to src/main/java/com/alist/api/modules/admin/auth/vo/AdminAuthApiKeyLoginVo.java index 6482e3f..4a9647a 100644 --- a/src/main/java/com/alist/api/modules/admin/auth/vo/AdminApiKeyLoginVo.java +++ b/src/main/java/com/alist/api/modules/admin/auth/vo/AdminAuthApiKeyLoginVo.java @@ -8,7 +8,7 @@ import lombok.Setter; @Schema(description = "Admin API Key 로그인 응답") @Getter @Setter -public class AdminApiKeyLoginVo { +public class AdminAuthApiKeyLoginVo { @Schema(description = "로그인 성공 여부", example = "true") private boolean login; diff --git a/src/main/java/com/alist/api/modules/admin/auth/vo/AdminAuthLoginCheckedVo.java b/src/main/java/com/alist/api/modules/admin/auth/vo/AdminAuthLoginCheckedVo.java new file mode 100644 index 0000000..c3bd9bb --- /dev/null +++ b/src/main/java/com/alist/api/modules/admin/auth/vo/AdminAuthLoginCheckedVo.java @@ -0,0 +1,34 @@ +package com.alist.api.modules.admin.auth.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +@Schema(description = "Admin 로그인 상태 확인 응답") +@Getter +@Setter +public class AdminAuthLoginCheckedVo { + @Schema(description = "Admin Access Token 쿠키 존재 여부", example = "true") + private boolean adminAccessToken; + + @Schema(description = "Admin Refresh Token 쿠키 존재 여부", example = "true") + private boolean adminRefreshToken; + + @Schema(description = "로그인 상태 여부", example = "true") + private boolean loggedIn; + + @Schema(description = "관리자 아이디", example = "admin") + private String userId; + + @Schema(description = "회원 PK", example = "14") + private Integer userIdx; + + @Schema(description = "회원 토큰 PK", example = "14") + private Integer userTokenIdx; + + @Schema(description = "관리자 권한 코드", example = "A") + private String userRole; + + @Schema(description = "회원 유형 코드. A: 관리자", example = "A") + private String userType; +} diff --git a/src/main/java/com/alist/api/modules/admin/auth/vo/AdminLoginVo.java b/src/main/java/com/alist/api/modules/admin/auth/vo/AdminAuthLoginVo.java similarity index 94% rename from src/main/java/com/alist/api/modules/admin/auth/vo/AdminLoginVo.java rename to src/main/java/com/alist/api/modules/admin/auth/vo/AdminAuthLoginVo.java index b1270b6..657d156 100644 --- a/src/main/java/com/alist/api/modules/admin/auth/vo/AdminLoginVo.java +++ b/src/main/java/com/alist/api/modules/admin/auth/vo/AdminAuthLoginVo.java @@ -8,9 +8,9 @@ import lombok.Setter; @Schema(description = "Admin 로그인 응답") @Setter @Getter -public class AdminLoginVo { +public class AdminAuthLoginVo { @Schema(description = "로그인 성공 여부", example = "true") - private boolean isLogin; + private boolean login; @Schema(description = "회원 PK", example = "14") private Integer userIdx; diff --git a/src/main/java/com/alist/api/modules/admin/auth/vo/AdminAuthLogoutVo.java b/src/main/java/com/alist/api/modules/admin/auth/vo/AdminAuthLogoutVo.java new file mode 100644 index 0000000..cb46c2b --- /dev/null +++ b/src/main/java/com/alist/api/modules/admin/auth/vo/AdminAuthLogoutVo.java @@ -0,0 +1,13 @@ +package com.alist.api.modules.admin.auth.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +@Schema(description = "Admin 로그아웃 응답") +@Getter +@Setter +public class AdminAuthLogoutVo { + @Schema(description = "로그아웃 처리 여부", example = "true") + private boolean loggedOut; +} diff --git a/src/main/java/com/alist/api/modules/admin/auth/vo/AdminAuthRefreshVo.java b/src/main/java/com/alist/api/modules/admin/auth/vo/AdminAuthRefreshVo.java new file mode 100644 index 0000000..494caa6 --- /dev/null +++ b/src/main/java/com/alist/api/modules/admin/auth/vo/AdminAuthRefreshVo.java @@ -0,0 +1,13 @@ +package com.alist.api.modules.admin.auth.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +@Schema(description = "Admin 리프레시 토큰 발급 응답") +@Getter +@Setter +public class AdminAuthRefreshVo { + @Schema(description = "리프레시 처리 여부", example = "true") + private boolean refreshed; +} diff --git a/src/main/resources/mapper/admin/auth/AdminLoginMapper.xml b/src/main/resources/mapper/admin/auth/AdminAuthMapper.xml similarity index 62% rename from src/main/resources/mapper/admin/auth/AdminLoginMapper.xml rename to src/main/resources/mapper/admin/auth/AdminAuthMapper.xml index 26e39dd..567d3f1 100644 --- a/src/main/resources/mapper/admin/auth/AdminLoginMapper.xml +++ b/src/main/resources/mapper/admin/auth/AdminAuthMapper.xml @@ -2,77 +2,45 @@ - - /*AdminLoginMapper.updateAdminRefreshToken*/ - UPDATE ALISTLMS.test_user_token - SET refresh_token = #{refreshToken} - , expires_at = #{expiresAt} - , updated_at = now() - WHERE user_token_idx = #{userTokenIdx} - AND user_type IN ('A') - - - /*AdminLoginMapper.updateAdminLastLoginAt*/ - UPDATE ALISTLMS.test_user - SET last_login_at = now() - , update_at = now() - WHERE user_idx = #{userIdx} - - - /*AdminLoginMapper.clearAdminRefreshToken*/ - UPDATE ALISTLMS.test_user_token - SET refresh_token = null - , expires_at = null - , updated_at = now() - WHERE user_token_idx = #{userTokenIdx} - AND user_type IN ('A') - - - /*AdminLoginMapper.updateAdminApiKeyLoginRefreshToken*/ - UPDATE ALISTLMS.test_user_token - SET refresh_token = #{refreshToken} - , expires_at = #{expiresAt} - , updated_at = now() - WHERE user_token_idx = #{userTokenIdx} - AND user_type IN ('A') - - + /*AdminAuthMapper.selectAdminAuthLogin*/ SELECT ATU.user_idx - , ATU.id - , ATU.password - , ATUT.user_token_idx - , ATUT.user_role - , ATUT.user_type + , ATU.id + , ATU.password + , ATUT.user_token_idx + , ATUT.user_role + , ATUT.user_type FROM ALISTLMS.test_user ATU INNER JOIN ALISTLMS.test_user_token ATUT ON ATUT.user_idx = ATU.user_idx WHERE ATU.id = #{id} - AND ATU.del_yn = 1 - AND ATUT.user_type IN ('A') + AND ATU.del_yn = 1 + AND ATUT.user_type IN ('A') LIMIT 1 - + /*AdminAuthMapper.selectAdminTokenByUserTokenIdx*/ SELECT ATU.user_idx - , ATU.id - , ATUT.user_token_idx - , ATUT.refresh_token - , ATUT.user_role - , ATUT.user_type + , ATU.id + , ATUT.user_token_idx + , ATUT.refresh_token + , ATUT.user_role + , ATUT.user_type FROM ALISTLMS.test_user_token ATUT INNER JOIN ALISTLMS.test_user ATU ON ATU.user_idx = ATUT.user_idx WHERE ATUT.user_token_idx = #{userTokenIdx} - AND ATUT.user_type IN ('A') - AND ATU.del_yn = 1 + AND ATUT.user_type IN ('A') + AND ATU.del_yn = 1 LIMIT 1 - + /*AdminAuthMapper.selectAdminAuthApiKeyLogin*/ SELECT ATU.user_idx - , ATU.id - , ATUT.user_token_idx - , ATUT.user_role - , ATUT.user_type + , ATU.id + , ATUT.user_token_idx + , ATUT.user_role + , ATUT.user_type FROM ALISTLMS.test_user_token ATUT INNER JOIN ALISTLMS.test_user ATU ON ATU.user_idx = ATUT.user_idx WHERE ATUT.user_api_key = #{userApiKey} @@ -80,4 +48,42 @@ AND ATU.del_yn = 1 LIMIT 1 + + + /*AdminAuthMapper.updateAdminRefreshToken*/ + UPDATE ALISTLMS.test_user_token + SET refresh_token = #{refreshToken} + , expires_at = #{expiresAt} + , updated_at = now() + WHERE user_token_idx = #{userTokenIdx} + AND user_type IN ('A') + + + + /*AdminAuthMapper.updateAdminLastLoginAt*/ + UPDATE ALISTLMS.test_user + SET last_login_at = now() + , update_at = now() + WHERE user_idx = #{userIdx} + + + + /*AdminAuthMapper.updateClearAdminRefreshToken*/ + UPDATE ALISTLMS.test_user_token + SET refresh_token = null + , expires_at = null + , updated_at = now() + WHERE user_token_idx = #{userTokenIdx} + AND user_type IN ('A') + + + + /*AdminAuthMapper.updateAdminApiKeyLoginRefreshToken*/ + UPDATE ALISTLMS.test_user_token + SET refresh_token = #{refreshToken} + , expires_at = #{expiresAt} + , updated_at = now() + WHERE user_token_idx = #{userTokenIdx} + AND user_type IN ('A') +