diff --git a/src/main/java/com/kamco/cd/kamcoback/members/AuthController.java b/src/main/java/com/kamco/cd/kamcoback/members/AuthController.java index 8596df04..5487bc2d 100644 --- a/src/main/java/com/kamco/cd/kamcoback/members/AuthController.java +++ b/src/main/java/com/kamco/cd/kamcoback/members/AuthController.java @@ -3,6 +3,9 @@ package com.kamco.cd.kamcoback.members; import com.kamco.cd.kamcoback.auth.CustomUserDetails; import com.kamco.cd.kamcoback.auth.JwtTokenProvider; import com.kamco.cd.kamcoback.auth.RefreshTokenService; +import com.kamco.cd.kamcoback.common.enums.StatusType; +import com.kamco.cd.kamcoback.common.enums.error.AuthErrorCode; +import com.kamco.cd.kamcoback.common.exception.CustomApiException; import com.kamco.cd.kamcoback.config.api.ApiResponseDto; import com.kamco.cd.kamcoback.members.dto.MembersDto; import com.kamco.cd.kamcoback.members.dto.SignInRequest; @@ -104,16 +107,25 @@ public class AuthController { SignInRequest request, HttpServletResponse response) { - Authentication authentication = - authenticationManager.authenticate( - new UsernamePasswordAuthenticationToken(request.getUsername(), request.getPassword())); - + // 사용자 상태 조회 String status = authService.getUserStatus(request); - + Authentication authentication = null; MembersDto.Member member = new MembersDto.Member(); + // 비활성 상태면 임시패스워드를 비교함 + if (StatusType.INACTIVE.getId().equals(status)) { + if (!authService.isTempPasswordValid(request)) { + throw new CustomApiException(AuthErrorCode.LOGIN_PASSWORD_MISMATCH); + } + } else { + authentication = + authenticationManager.authenticate( + new UsernamePasswordAuthenticationToken( + request.getUsername(), request.getPassword())); + } + // INACTIVE 비활성 상태(새로운 패스워드 입력 해야함), DELETED 탈퇴 - if (!"ACTIVE".equals(status)) { + if (!StatusType.ACTIVE.getId().equals(status)) { return ApiResponseDto.ok(new TokenResponse(status, null, null, member)); } diff --git a/src/main/java/com/kamco/cd/kamcoback/members/dto/MembersDto.java b/src/main/java/com/kamco/cd/kamcoback/members/dto/MembersDto.java index 1c777896..f0de1810 100644 --- a/src/main/java/com/kamco/cd/kamcoback/members/dto/MembersDto.java +++ b/src/main/java/com/kamco/cd/kamcoback/members/dto/MembersDto.java @@ -3,6 +3,7 @@ package com.kamco.cd.kamcoback.members.dto; import com.kamco.cd.kamcoback.common.enums.RoleType; import com.kamco.cd.kamcoback.common.enums.StatusType; import com.kamco.cd.kamcoback.common.utils.Enums; +import com.kamco.cd.kamcoback.common.utils.interfaces.EnumValid; import com.kamco.cd.kamcoback.common.utils.interfaces.JsonFormatDttm; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; @@ -107,7 +108,7 @@ public class MembersDto { @Schema(description = "관리자 유형", example = "ADMIN") @NotBlank - @Size(max = 50) + @EnumValid(enumClass = RoleType.class, message = "userRole은 ADMIN, LABELER, REVIEWER만 가능합니다.") private String userRole; @Schema(description = "이름", example = "홍길동") diff --git a/src/main/java/com/kamco/cd/kamcoback/members/service/AuthService.java b/src/main/java/com/kamco/cd/kamcoback/members/service/AuthService.java index 287bc99b..7220ae34 100644 --- a/src/main/java/com/kamco/cd/kamcoback/members/service/AuthService.java +++ b/src/main/java/com/kamco/cd/kamcoback/members/service/AuthService.java @@ -33,4 +33,14 @@ public class AuthService { public String getUserStatus(SignInRequest request) { return membersCoreService.getUserStatus(request); } + + /** + * 임시 패스워드 비교 + * + * @param request + * @return + */ + public boolean isTempPasswordValid(SignInRequest request) { + return membersCoreService.isTempPasswordValid(request); + } } diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/core/MembersCoreService.java b/src/main/java/com/kamco/cd/kamcoback/postgres/core/MembersCoreService.java index 77039d5a..4ddb2490 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/core/MembersCoreService.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/core/MembersCoreService.java @@ -46,7 +46,7 @@ public class MembersCoreService { MemberEntity memberEntity = new MemberEntity(); memberEntity.setUserId(addReq.getUserId()); memberEntity.setUserRole(addReq.getUserRole()); - memberEntity.setTempPassword(addReq.getTempPassword()); // 임시 패스워드는 암호화 하지 않음 + memberEntity.setTempPassword(addReq.getTempPassword().trim()); // 임시 패스워드는 암호화 하지 않음 memberEntity.setPassword(hashedPassword); memberEntity.setName(addReq.getName()); memberEntity.setEmployeeNo(addReq.getEmployeeNo()); @@ -71,7 +71,14 @@ public class MembersCoreService { // 임시 패스워드는 암호화 하지 않음 if (StringUtils.isNotBlank(updateReq.getTempPassword())) { - memberEntity.setTempPassword(updateReq.getTempPassword()); + // 임시 패스워드가 기존과 다르면 패스워드 변경으로 처리함 + // 상태 INACTIVE로 변경하여 사용자가 로그인할때 패스워드 변경하게함 + // 패스워드 리셋이므로 로그인 실패카운트 초기화처리함 + if (!memberEntity.getTempPassword().equals(updateReq.getTempPassword().trim())) { + memberEntity.setStatus(StatusType.INACTIVE.getId()); + memberEntity.setLoginFailCount(0); + } + memberEntity.setTempPassword(updateReq.getTempPassword().trim()); } if (StringUtils.isNotBlank(memberEntity.getEmployeeNo())) { @@ -145,6 +152,21 @@ public class MembersCoreService { return memberEntity.getStatus(); } + /** + * 임시 패스워드 비교 + * + * @param request + * @return + */ + public boolean isTempPasswordValid(SignInRequest request) { + MemberEntity memberEntity = + membersRepository + .findByUserId(request.getUsername()) + .orElseThrow(MemberNotFoundException::new); + + return memberEntity.getTempPassword().equals(request.getPassword().trim()); + } + /** * 최초 로그인 저장 마지막 로그인 저장 * diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetMngHstEntity.java b/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetMngHstEntity.java index 22114522..332fde9b 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetMngHstEntity.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetMngHstEntity.java @@ -42,7 +42,7 @@ public class MapSheetMngHstEntity extends CommonDateEntity { private ZonedDateTime dataStateDttm; @Column(name = "use_inference") - private Boolean useInference; + private String useInference; @Column(name = "use_inference_dttm") private ZonedDateTime useInferenceDttm;