package com.takensoft.common.util; import com.takensoft.common.config.CommonConfig; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.AuthenticationEntryPoint; import org.springframework.stereotype.Component; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.time.LocalDateTime; /** * @author : takensoft * @since : 2024.04.05 * * 인증 에러 * AuthenticationEntryPoint 커스텀하여 인증이 실패한 경우에 대한 처리 */ @Component @Slf4j @RequiredArgsConstructor public class CustomAuthenticationEntryPoint implements AuthenticationEntryPoint { private final CommonConfig commonConfig; @Override public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { // 사용자의 요청이 인증되지 않았을 때 로그 출력 log.info("Unauthorized user request: {}", authException.getMessage()); // 요청자의 IP 주소 로그 출력 log.info("Requester IP: {}", request.getRemoteAddr()); // 요청 URI 로그 출력 log.info("Request URI: {}", request.getRequestURI()); // 접근 거부 에러 응답을 위한 객체 생성 ErrorResponse errorResponse = new ErrorResponse(); errorResponse.setMessage("Token expired"); // 에러 응답 메시지 설정 // errorResponse.setMessage("인증에러 발생: " + authException.getMessage()); // 에러 응답 메시지 설정 errorResponse.setPath(request.getRequestURI()); // 요청 경로 설정 errorResponse.setError(HttpStatus.UNAUTHORIZED.getReasonPhrase()); // 오류 원인 설정 errorResponse.setStatus(HttpStatus.UNAUTHORIZED.value()); // 상태 코드 설정 errorResponse.setTimestamp(LocalDateTime.now()); // 응답 시간 설정 // 응답 헤더 설정 및 json 응답 전송 response.setContentType(MediaType.APPLICATION_JSON_VALUE); response.setStatus(HttpStatus.UNAUTHORIZED.value()); response.getOutputStream().write(commonConfig.getObjectMapper().writeValueAsBytes(errorResponse)); } }