[api] 회원 비밀번호 확인 추가

This commit is contained in:
2026-05-15 17:37:35 +09:00
parent 4368eccc82
commit 8cdcc81aaf
9 changed files with 175 additions and 4 deletions
@@ -3,19 +3,20 @@ package com.alist.api.modules.user;
import com.alist.api.common.response.ApiResponse; import com.alist.api.common.response.ApiResponse;
import com.alist.api.common.response.ApiResponseCode; import com.alist.api.common.response.ApiResponseCode;
import com.alist.api.modules.user.form.MigrationUserForm; import com.alist.api.modules.user.form.MigrationUserForm;
import com.alist.api.modules.user.form.UserPasswordChangeForm;
import com.alist.api.modules.user.form.UserPasswordCheckForm;
import com.alist.api.modules.user.form.UserSignupForm; import com.alist.api.modules.user.form.UserSignupForm;
import com.alist.api.modules.user.mapper.UserMapper;
import com.alist.api.modules.user.service.UserService; import com.alist.api.modules.user.service.UserService;
import com.alist.api.modules.user.vo.MigrationUserVo; import com.alist.api.modules.user.vo.MigrationUserVo;
import com.alist.api.modules.user.vo.UserPasswordCheckVo;
import com.alist.api.modules.user.vo.UserVo; import com.alist.api.modules.user.vo.UserVo;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Tag(name = "05. 사용자 관리", description = "사용자 회원가입 및 관리 API") @Tag(name = "05. 사용자 관리", description = "사용자 회원가입 및 관리 API")
@Slf4j @Slf4j
@@ -63,4 +64,45 @@ public class UserController {
return ApiResponse.entity(result, ApiResponseCode.CODE_2001, "이전 회원"); return ApiResponse.entity(result, ApiResponseCode.CODE_2001, "이전 회원");
} }
@Operation(
summary = "사용자 비밀번호 확인",
description = "로그인한 사용자의 현재 비밀번호가 일치하는지 확인합니다."
)
@PostMapping("/password/check")
public ResponseEntity<ApiResponse<UserPasswordCheckVo>> passwordCheck(
@Valid @RequestBody UserPasswordCheckForm userPasswordCheckForm
) {
UserPasswordCheckVo result = userService.selectPasswordCheck(userPasswordCheckForm.toUserPasswordCheckDto());
if (!result.isPasswordMatched()) {
if (result.getResultCode() == 4003) {
return ApiResponse.entity(result, ApiResponseCode.CODE_4001);
} else if (result.getResultCode() == 2003) {
return ApiResponse.entity(result, ApiResponseCode.CODE_2003);
}
}
return ApiResponse.entity(result, ApiResponseCode.CODE_200);
}
@Operation(
summary = "사용자 비밀번호 수정",
description = "로그인한 사용자의 현재 비밀번호를 확인한 뒤 새 비밀번호로 변경합니다."
)
@PatchMapping("/password")
public ResponseEntity<ApiResponse<UserPasswordChangeVo>> updatePassword(
@Valid @RequestBody UserPasswordChangeForm userPasswordChangeForm
) {
UserPasswordChangeVo result = userService.updatePassword(userPasswordChangeForm.toUserPasswordChangeDto());
if (!result.isPasswordChanged()) {
if (result.getResultCode() == 4003 || result.getResultCode() == 4001) {
return ApiResponse.entity(result, ApiResponseCode.CODE_4001);
}
return ApiResponse.entity(result, ApiResponseCode.CODE_2003);
}
return ApiResponse.entity(result, ApiResponseCode.CODE_2005, "비밀번호 변경");
}
} }
@@ -0,0 +1,12 @@
package com.alist.api.modules.user.dto;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class UserPasswordChangeDto {
private Integer userTokenIdx;
private String currentPassword;
private String newPassword;
}
@@ -0,0 +1,11 @@
package com.alist.api.modules.user.dto;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class UserPasswordCheckDto {
private Integer userTokenIdx;
private String password;
}
@@ -0,0 +1,22 @@
package com.alist.api.modules.user.form;
import jakarta.validation.constraints.NotBlank;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class UserPasswordChangeForm {
@NotBlank(message = "현재 비밀번호는 필수입니다.")
private String currentPassword;
@NotBlank(message = "새 비밀번호는 필수입니다.")
private String newPassword;
public UserPasswordChangeDto toUserPasswordChangeDto() {
UserPasswordChangeDto dto = new UserPasswordChangeDto();
dto.setCurrentPassword(currentPassword);
dto.setNewPassword(newPassword);
return dto;
}
}
@@ -0,0 +1,19 @@
package com.alist.api.modules.user.form;
import com.alist.api.modules.user.dto.UserPasswordCheckDto;
import jakarta.validation.constraints.NotBlank;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class UserPasswordCheckForm {
@NotBlank(message = "비밀번호는 필수입니다.")
private String password;
public UserPasswordCheckDto toUserPasswordCheckDto() {
UserPasswordCheckDto userPasswordCheckDto = new UserPasswordCheckDto();
userPasswordCheckDto.setPassword(password);
return userPasswordCheckDto;
}
}
@@ -2,6 +2,7 @@ package com.alist.api.modules.user.mapper;
import com.alist.api.modules.user.dto.UserDto; import com.alist.api.modules.user.dto.UserDto;
import com.alist.api.modules.user.dto.UserTokenDto; import com.alist.api.modules.user.dto.UserTokenDto;
import com.alist.api.modules.user.vo.UserVo;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
@Mapper @Mapper
@@ -11,4 +12,6 @@ public interface UserMapper {
int insertUserSignup(UserDto userDto); int insertUserSignup(UserDto userDto);
int insertUserTokenSignup(UserTokenDto userTokenDto); int insertUserTokenSignup(UserTokenDto userTokenDto);
UserVo selectUserByUserIdx(Integer userIdx);
} }
@@ -1,6 +1,7 @@
package com.alist.api.modules.user.service; package com.alist.api.modules.user.service;
import com.alist.api.common.utils.ApiKeyGenerator; import com.alist.api.common.utils.ApiKeyGenerator;
import com.alist.api.common.utils.SecurityUtil;
import com.alist.api.modules.migration.alist.user.dto.AlistUserDto; import com.alist.api.modules.migration.alist.user.dto.AlistUserDto;
import com.alist.api.modules.migration.alist.user.service.AlistUserService; import com.alist.api.modules.migration.alist.user.service.AlistUserService;
import com.alist.api.modules.migration.alist.user.vo.AlistUserVo; import com.alist.api.modules.migration.alist.user.vo.AlistUserVo;
@@ -8,9 +9,11 @@ import com.alist.api.modules.migration.eltown.user.dto.EltownUserDto;
import com.alist.api.modules.migration.eltown.user.service.EltownUserService; import com.alist.api.modules.migration.eltown.user.service.EltownUserService;
import com.alist.api.modules.migration.eltown.user.vo.EltownUserVo; import com.alist.api.modules.migration.eltown.user.vo.EltownUserVo;
import com.alist.api.modules.user.dto.UserDto; import com.alist.api.modules.user.dto.UserDto;
import com.alist.api.modules.user.dto.UserPasswordCheckDto;
import com.alist.api.modules.user.dto.UserTokenDto; import com.alist.api.modules.user.dto.UserTokenDto;
import com.alist.api.modules.user.mapper.UserMapper; import com.alist.api.modules.user.mapper.UserMapper;
import com.alist.api.modules.user.vo.MigrationUserVo; import com.alist.api.modules.user.vo.MigrationUserVo;
import com.alist.api.modules.user.vo.UserPasswordCheckVo;
import com.alist.api.modules.user.vo.UserVo; import com.alist.api.modules.user.vo.UserVo;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.dao.DuplicateKeyException; import org.springframework.dao.DuplicateKeyException;
@@ -107,4 +110,39 @@ public class UserService {
return result; return result;
} }
@Transactional(readOnly = true)
public UserPasswordCheckVo selectPasswordCheck(UserPasswordCheckDto userPasswordCheckDto) {
UserPasswordCheckVo result = new UserPasswordCheckVo();
Integer userTokenIdx = SecurityUtil.getLoginUserTokenIdx();
userPasswordCheckDto.setUserTokenIdx(userTokenIdx);
if (userTokenIdx == null || userPasswordCheckDto.getPassword() == null) {
result.setPasswordMatched(false);
result.setResultCode(4003);
return result;
}
UserVo userVo = userMapper.selectUserByUserIdx(userPasswordCheckDto.getUserTokenIdx());
if (userVo == null || userVo.getPassword() == null) {
result.setPasswordMatched(false);
result.setResultCode(2003);
return result;
}
boolean matched = passwordEncoder.matches(userPasswordCheckDto.getPassword(), userVo.getPassword());
if (!matched) {
result.setPasswordMatched(false);
result.setResultCode(2003);
return result;
}
result.setPasswordMatched(true);
result.setResultCode(200);
return result;
}
} }
@@ -0,0 +1,14 @@
package com.alist.api.modules.user.vo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class UserPasswordCheckVo {
private boolean passwordMatched;
@JsonIgnore
private Integer resultCode;
}
@@ -20,4 +20,14 @@
where id = #{id} where id = #{id}
</select> </select>
<select id="selectUserByUserIdx" resultType="com.alist.api.modules.user.vo.UserVo">
/*UserMapper.selectUserByUserIdx*/
SELECT ATU.user_idx
, ATU.password
FROM ALISTLMS.test_user ATU
INNER JOIN ALISTLMS.test_user_token ATUT ON ATUT.user_idx = ATU.user_idx
WHERE ATUT.user_token_idx = #{userTokenIdx}
AND ATU.del_yn = 1
</select>
</mapper> </mapper>