Skip to content

Commit

Permalink
[FEAT] 비밀번호 찾기 기능을 위한 사용자 인증 체계 구현 (#94)
Browse files Browse the repository at this point in the history
- 사용자 그룹 확인용 '/check-user' 엔드포인트 추가
- 이메일로 Cognito 사용자 그룹 조회 기능 구현 (AdminListGroupsForUserRequest 활용)
- 인증 관련 에러 코드 체계 개선 (사용자 상태/인증코드/비밀번호 카테고리화)
- AuthService에 사용자 그룹 조회 메소드 추가 및 예외처리 구현
  • Loading branch information
liimjiin authored Nov 20, 2024
1 parent 99af4c4 commit 485dd88
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -67,4 +67,15 @@ public ResponseEntity<?> signUp(@RequestBody SignUpRequestDto request) {
return ResponseEntity.ok().body(new SuccessResponseDto("회원가입이 완료되었습니다."));
}

@PostMapping("/check-user")
public ResponseEntity<?> checkUser(@RequestBody Map<String, String> request) {
String email = request.get("email");
List<String> groups = authService.getUserGroups(email);

Map<String, Object> response = new HashMap<>();
response.put("groups", groups);

return ResponseEntity.ok(response);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -226,4 +226,27 @@ private void createNewUser(String email) {
}
}

public List<String> getUserGroups(String email) {
try {
UserType user = findUserByEmail(email, true); // 이미 구현된 메소드 활용

AdminListGroupsForUserRequest groupsRequest = AdminListGroupsForUserRequest.builder()
.userPoolId(userPoolId)
.username(user.username())
.build();

AdminListGroupsForUserResponse groupsResponse = cognitoClient.adminListGroupsForUser(groupsRequest);

return groupsResponse.groups().stream()
.map(GroupType::groupName)
.toList();

} catch (UserNotFoundException e) {
throw new AuthUserNotFoundException();
} catch (Exception e) {
log.error("Failed to get user groups", e);
throw new AuthenticationException(ErrorCode.INTERNAL_SERVER_ERROR);
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,8 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
"/api/auth/signup",
"/api/auth/send-verification",
"/api/auth/verify-code",
"/api/auth/resend-verification"
"/api/auth/resend-verification",
"/api/auth/check-user"
).permitAll()
// 기존 역할 기반 접근 제어
.requestMatchers("/api/instructor/**").hasRole("INSTRUCTOR")
Expand Down
30 changes: 25 additions & 5 deletions src/main/java/com/example/epari/global/exception/ErrorCode.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,35 @@ public enum ErrorCode {
INVALID_INPUT(HttpStatus.BAD_REQUEST, "CMM-004", "입력값이 올바르지 않습니다."),

// 인증, 인가 관련 에러 코드 (AUTH)
// 기본 인증 관련
UNAUTHORIZED(HttpStatus.UNAUTHORIZED, "AUTH-001", "인증이 필요한 요청입니다."),
FORBIDDEN(HttpStatus.FORBIDDEN, "AUTH-002", "해당 리소스에 대한 접근 권한이 없습니다."),

// 사용자 상태 관련
USER_NOT_FOUND(HttpStatus.NOT_FOUND, "AUTH-003", "사용자를 찾을 수 없습니다."),
USER_ALREADY_EXISTS(HttpStatus.CONFLICT, "AUTH-004", "이미 가입된 이메일입니다."),
INVALID_VERIFICATION_CODE(HttpStatus.BAD_REQUEST, "AUTH-005", "잘못된 인증 코드입니다. 다시 시도해주세요."),
VERIFICATION_CODE_EXPIRED(HttpStatus.BAD_REQUEST, "AUTH-006", "만료된 인증 코드입니다. 코드를 재발송 해주세요."),
SIGNUP_FAILED(HttpStatus.BAD_REQUEST, "AUTH-007", "회원가입 처리 중 오류가 발생했습니다."),
PENDING_APPROVAL(HttpStatus.BAD_REQUEST, "AUTH-008", "가입 승인 대기중입니다."),
VERIFICATION_CODE_LIMIT_EXCEEDED(HttpStatus.TOO_MANY_REQUESTS, "AUTH-009", "잠시 후 다시 시도해주세요."),
USER_NOT_CONFIRMED(HttpStatus.BAD_REQUEST, "AUTH-005", "이메일 인증이 완료되지 않은 사용자입니다."),
USER_STATUS_INVALID(HttpStatus.BAD_REQUEST, "AUTH-006", "비밀번호를 재설정할 수 없는 사용자 상태입니다."),
INVALID_USER_STATUS(HttpStatus.BAD_REQUEST, "AUTH-007", "유효하지 않은 사용자 상태입니다."),

// 인증 코드 관련
INVALID_VERIFICATION_CODE(HttpStatus.BAD_REQUEST, "AUTH-008", "잘못된 인증 코드입니다. 다시 시도해주세요."),
VERIFICATION_CODE_EXPIRED(HttpStatus.BAD_REQUEST, "AUTH-009", "만료된 인증 코드입니다. 코드를 재발송 해주세요."),
VERIFICATION_CODE_LIMIT_EXCEEDED(HttpStatus.TOO_MANY_REQUESTS, "AUTH-010", "잠시 후 다시 시도해주세요."),

// 비밀번호 관련
INVALID_PASSWORD_RESET_REQUEST(HttpStatus.BAD_REQUEST, "AUTH-011", "유효하지 않은 비밀번호 재설정 요청입니다."),
PASSWORD_RESET_CODE_MISMATCH(HttpStatus.BAD_REQUEST, "AUTH-012", "잘못된 비밀번호 재설정 코드입니다."),
PASSWORD_RESET_CODE_EXPIRED(HttpStatus.BAD_REQUEST, "AUTH-013", "만료된 비밀번호 재설정 코드입니다. 코드를 재발송 해주세요."),
INVALID_PASSWORD_FORMAT(HttpStatus.BAD_REQUEST, "AUTH-014", "비밀번호 형식이 올바르지 않습니다."),
INVALID_PASSWORD(HttpStatus.BAD_REQUEST, "AUTH-015", "유효하지 않은 비밀번호입니다."),
RESET_REQUIRED_PASSWORD(HttpStatus.BAD_REQUEST, "AUTH-016", "비밀번호 재설정이 필요한 상태입니다."),

// 요청 제한/오류 관련
TOO_MANY_REQUESTS(HttpStatus.TOO_MANY_REQUESTS, "AUTH-017", "너무 많은 요청이 발생했습니다. 잠시 후 다시 시도해주세요."),
INVALID_PARAMETER(HttpStatus.BAD_REQUEST, "AUTH-018", "잘못된 파라미터가 전달되었습니다."),
SIGNUP_FAILED(HttpStatus.BAD_REQUEST, "AUTH-019", "회원가입 처리 중 오류가 발생했습니다."),
PENDING_APPROVAL(HttpStatus.BAD_REQUEST, "AUTH-020", "가입 승인 대기중입니다."),

// Student 관련 에러 코드(ST
STUDENT_NOT_FOUND(HttpStatus.NOT_FOUND, "STD-001", "학생 정보를 찾을 수 없습니다."),
Expand Down

0 comments on commit 485dd88

Please sign in to comment.