[api] 회원 비밀번호 확인 추가
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user