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.access.AccessDeniedException; import org.springframework.security.web.access.AccessDeniedHandler; 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 * * 인가(권한) 에러 * AccessDeniedHandler를 커스텀하여 접근 거부된 요청에 대한 처리 */ @Component @Slf4j @RequiredArgsConstructor public class CustomAccessDenieHandler implements AccessDeniedHandler { private final CommonConfig commonConfig; @Override public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException { // 접근 거부 예외에 대한 로그 출력 log.error("Access Denied Exception: {}", accessDeniedException.getMessage()); // 접근 거부 에러 응답을 위한 객체 생성 ErrorResponse errorResponse = new ErrorResponse(); errorResponse.setMessage("Access Denied"); // 에러 응답 메시지 설정 errorResponse.setPath(request.getRequestURI()); // 요청 경로 설정 errorResponse.setError(HttpStatus.FORBIDDEN.getReasonPhrase()); // 에러 메시지 설정 errorResponse.setStatus(HttpStatus.FORBIDDEN.value()); // 에러 상태 코드 설정 errorResponse.setTimestamp(LocalDateTime.now()); // 응답 시간 설정 // 응답 헤더 설정 및 json 응답 전송 response.setContentType(MediaType.APPLICATION_JSON_VALUE); response.setStatus(HttpStatus.FORBIDDEN.value()); response.getOutputStream().write(commonConfig.getObjectMapper().writeValueAsBytes(errorResponse)); } }