Skip to content

Commit 85e3d1d

Browse files
committed
Feat: 비밀번호 변경 API 예외 처리 보완
1 parent 28aced9 commit 85e3d1d

File tree

5 files changed

+60
-0
lines changed

5 files changed

+60
-0
lines changed

src/main/java/com/back/domain/user/controller/UserControllerDocs.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,21 @@ ResponseEntity<RsData<UserDetailResponse>> updateMyProfile(
341341
""")
342342
)
343343
),
344+
@ApiResponse(
345+
responseCode = "403",
346+
description = "소셜 로그인 회원 비밀번호 변경 불가",
347+
content = @Content(
348+
mediaType = "application/json",
349+
examples = @ExampleObject(value = """
350+
{
351+
"success": false,
352+
"code": "USER_010",
353+
"message": "소셜 로그인 회원은 비밀번호를 변경할 수 없습니다.",
354+
"data": null
355+
}
356+
""")
357+
)
358+
),
344359
@ApiResponse(
345360
responseCode = "403",
346361
description = "정지된 계정",

src/main/java/com/back/domain/user/service/UserService.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,11 @@ public void changePassword(Long userId, ChangePasswordRequest request) {
7878
// 사용자 조회 및 상태 검증
7979
User user = getValidUser(userId);
8080

81+
// 소셜 로그인 사용자는 비밀번호 변경 불가
82+
if (user.getProvider() != null) {
83+
throw new CustomException(ErrorCode.SOCIAL_PASSWORD_CHANGE_FORBIDDEN);
84+
}
85+
8186
// 현재 비밀번호 검증
8287
if (!passwordEncoder.matches(request.currentPassword(), user.getPassword())) {
8388
throw new CustomException(ErrorCode.INVALID_CREDENTIALS);

src/main/java/com/back/global/exception/ErrorCode.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ public enum ErrorCode {
1818
USER_EMAIL_NOT_VERIFIED(HttpStatus.FORBIDDEN, "USER_007", "이메일 인증 후 로그인할 수 있습니다."),
1919
USER_SUSPENDED(HttpStatus.FORBIDDEN, "USER_008", "정지된 계정입니다. 관리자에게 문의하세요."),
2020
USER_DELETED(HttpStatus.GONE, "USER_009", "탈퇴한 계정입니다."),
21+
SOCIAL_PASSWORD_CHANGE_FORBIDDEN(HttpStatus.FORBIDDEN, "USER_010", "소셜 로그인 회원은 비밀번호를 변경할 수 없습니다."),
2122

2223
// ======================== 스터디룸 관련 ========================
2324
ROOM_NOT_FOUND(HttpStatus.NOT_FOUND, "ROOM_001", "존재하지 않는 방입니다."),

src/test/java/com/back/domain/user/controller/UserControllerTest.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,28 @@ void changePassword_invalidNewPassword() throws Exception {
413413
.andExpect(jsonPath("$.message").value("비밀번호는 최소 8자 이상, 숫자/특수문자를 포함해야 합니다."));
414414
}
415415

416+
@Test
417+
@DisplayName("소셜 로그인 회원 비밀번호 변경 시도 → 403 Forbidden (USER_010)")
418+
void changePassword_socialUser() throws Exception {
419+
User user = User.createUser("socialuser", "[email protected]", null);
420+
user.setProvider("kakao");
421+
user.setUserStatus(UserStatus.ACTIVE);
422+
userRepository.save(user);
423+
424+
String accessToken = generateAccessToken(user);
425+
426+
ChangePasswordRequest request = new ChangePasswordRequest("dummy", "NewP@ssw0rd!");
427+
428+
mvc.perform(patch("/api/users/me/password")
429+
.header("Authorization", "Bearer " + accessToken)
430+
.contentType(MediaType.APPLICATION_JSON)
431+
.content(objectMapper.writeValueAsString(request)))
432+
.andDo(print())
433+
.andExpect(status().isForbidden())
434+
.andExpect(jsonPath("$.code").value("USER_010"))
435+
.andExpect(jsonPath("$.message").value("소셜 로그인 회원은 비밀번호를 변경할 수 없습니다."));
436+
}
437+
416438
@Test
417439
@DisplayName("탈퇴 계정 비밀번호 변경 시도 → 410 Gone (USER_009)")
418440
void changePassword_deletedUser() throws Exception {

src/test/java/com/back/domain/user/service/UserServiceTest.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,23 @@ void changePassword_invalidNewPassword() {
236236
.hasMessage(ErrorCode.INVALID_PASSWORD.getMessage());
237237
}
238238

239+
@Test
240+
@DisplayName("소셜 로그인 회원 비밀번호 변경 시도 → SOCIAL_PASSWORD_CHANGE_FORBIDDEN 예외")
241+
void changePassword_socialUser() {
242+
// given
243+
User user = User.createUser("socialuser", "[email protected]", null);
244+
user.setProvider("kakao"); // 소셜 로그인 회원
245+
user.setUserStatus(UserStatus.ACTIVE);
246+
userRepository.save(user);
247+
248+
ChangePasswordRequest request = new ChangePasswordRequest("dummy", "NewP@ssw0rd!");
249+
250+
// when & then
251+
assertThatThrownBy(() -> userService.changePassword(user.getId(), request))
252+
.isInstanceOf(CustomException.class)
253+
.hasMessage(ErrorCode.SOCIAL_PASSWORD_CHANGE_FORBIDDEN.getMessage());
254+
}
255+
239256
@Test
240257
@DisplayName("탈퇴한 유저 비밀번호 변경 → USER_DELETED 예외")
241258
void changePassword_deletedUser() {

0 commit comments

Comments
 (0)