[api] AdminAuthController 이쪽 컨벤션 맞춰 변경
This commit is contained in:
@@ -23,6 +23,8 @@
|
||||
- DTO 안에 연관된 다른 DTO 변환이 꼭 필요할 때만 최소한의 보조 메서드를 둔다.
|
||||
- 외부 응답에 노출되면 안 되는 내부 필드는 응답에 사용될 수 있는 객체에서 `@JsonIgnore`로 숨긴다.
|
||||
- 등록, 수정, 삭제, 상태 변경처럼 처리 여부만 반환하는 VO 의 boolean 필드는 `processed` 로 통일한다. 예: `private boolean processed;`
|
||||
- Controller 요청/응답 타입은 가능한 한 Form/Dto/Vo 로 명시한다. `Map<String, Object>` 는 응답 구조가 고정되지 않는 임시 디버깅, 외부 라이브러리 passthrough 같은 예외 상황에서만 제한적으로 사용한다.
|
||||
- 응답 필드가 단순 boolean 몇 개뿐이어도 운영 API 에서는 VO 를 만든다. 예: 로그인 상태 확인 응답은 `Map<String, Object>` 보다 `AdminAuthLoginCheckedVo` 를 사용한다.
|
||||
- 목록 조회 API 는 특별한 사유가 없으면 기본적으로 페이징을 적용하고, 목록 조회 Form/Dto 는 `PageRequest`, 목록 응답 Vo 는 `PageResponse` 를 상속한다.
|
||||
|
||||
## Swagger/OpenAPI 문서화 규칙
|
||||
|
||||
@@ -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<ApiResponse<AdminLoginVo>> adminLogin(
|
||||
@Valid @RequestBody AdminLoginForm adminLoginForm
|
||||
public ResponseEntity<ApiResponse<AdminAuthLoginVo>> 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<ApiResponse<AdminApiKeyLoginVo>> adminApiKeyLogin(
|
||||
@Valid @RequestBody AdminApiKeyLoginForm adminApiKeyLoginForm
|
||||
public ResponseEntity<ApiResponse<AdminAuthApiKeyLoginVo>> 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<ApiResponse<Map<String, Object>>> refresh(
|
||||
public ResponseEntity<ApiResponse<AdminAuthRefreshVo>> 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<ApiResponse<Map<String, Object>>> loginChecked(
|
||||
public ResponseEntity<ApiResponse<AdminAuthLoginCheckedVo>> adminAuthLoginChecked(
|
||||
HttpServletRequest request
|
||||
) {
|
||||
Map<String, Object> 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<ApiResponse<Map<String, Object>>> logout(
|
||||
public ResponseEntity<ApiResponse<AdminAuthLogoutVo>> 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);
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -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;
|
||||
+1
-1
@@ -7,7 +7,7 @@ import java.time.Instant;
|
||||
|
||||
@Setter
|
||||
@Getter
|
||||
public class AdminLoginDto {
|
||||
public class AdminAuthLoginDto {
|
||||
private String id;
|
||||
private String password;
|
||||
|
||||
+6
-6
@@ -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;
|
||||
}
|
||||
}
|
||||
+7
-7
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
+2
-2
@@ -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;
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
+64
-58
@@ -2,77 +2,45 @@
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
|
||||
<mapper namespace="com.alist.api.modules.admin.auth.mapper.AdminAuthMapper">
|
||||
<update id="updateAdminRefreshToken">
|
||||
/*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')
|
||||
</update>
|
||||
<update id="updateAdminLastLoginAt">
|
||||
/*AdminLoginMapper.updateAdminLastLoginAt*/
|
||||
UPDATE ALISTLMS.test_user
|
||||
SET last_login_at = now()
|
||||
, update_at = now()
|
||||
WHERE user_idx = #{userIdx}
|
||||
</update>
|
||||
<update id="clearAdminRefreshToken">
|
||||
/*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')
|
||||
</update>
|
||||
<update id="updateAdminApiKeyLoginRefreshToken">
|
||||
/*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')
|
||||
</update>
|
||||
<select id="selectAdminLoginById" resultType="com.alist.api.modules.admin.auth.vo.AdminLoginVo">
|
||||
/*AdminLoginMapper.selectAdminLoginById*/
|
||||
<select id="selectAdminAuthLogin" resultType="com.alist.api.modules.admin.auth.vo.AdminAuthLoginVo">
|
||||
/*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
|
||||
</select>
|
||||
<select id="selectAdminTokenByUserTokenIdx" resultType="com.alist.api.modules.admin.auth.vo.AdminLoginVo">
|
||||
/*AdminLoginMapper.selectAdminTokenByUserTokenIdx*/
|
||||
|
||||
<select id="selectAdminTokenByUserTokenIdx" resultType="com.alist.api.modules.admin.auth.vo.AdminAuthLoginVo">
|
||||
/*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
|
||||
</select>
|
||||
<select id="selectAdminApiKeyLogin" resultType="com.alist.api.modules.admin.auth.vo.AdminApiKeyLoginVo">
|
||||
/*AdminLoginMapper.selectAdminApiKeyLogin*/
|
||||
|
||||
<select id="selectAdminAuthApiKeyLogin" resultType="com.alist.api.modules.admin.auth.vo.AdminAuthApiKeyLoginVo">
|
||||
/*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
|
||||
</select>
|
||||
|
||||
<update id="updateAdminRefreshToken">
|
||||
/*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')
|
||||
</update>
|
||||
|
||||
<update id="updateAdminLastLoginAt">
|
||||
/*AdminAuthMapper.updateAdminLastLoginAt*/
|
||||
UPDATE ALISTLMS.test_user
|
||||
SET last_login_at = now()
|
||||
, update_at = now()
|
||||
WHERE user_idx = #{userIdx}
|
||||
</update>
|
||||
|
||||
<update id="updateClearAdminRefreshToken">
|
||||
/*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')
|
||||
</update>
|
||||
|
||||
<update id="updateAdminApiKeyLoginRefreshToken">
|
||||
/*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')
|
||||
</update>
|
||||
</mapper>
|
||||
Reference in New Issue
Block a user