SpringSecurity가 자의적으로 정하던 오류 json 커스터마이징

JIWOO YUN·2023년 8월 21일
0

SpringDoc

목록 보기
2/2
post-custom-banner

기본적으로 SpringSecurity에 403 오류 양식이 존재한다.
근데 그게 마음에 들지 않거나 다르게 만들고 싶을 때 커스터마이징을 진행한다.

SpringSecurity에 exceptionHandling을 통해서 오류가 발생시 예외를 따로 처리한다.

추가로 ApiAuthenticationEntryPoint를 만든다.

-> 인증 예외가 생길경우 의미가 생기는 클래스 (인증 예외가 발생시 어떻게 할 것인지 결정하게 만듬)

  • 예외가 발생하면 Security에 등록을 통해서 이게 인증예외를 처리함.
  • 원하는 양식이 존재할 경우와 양식을 통일 시키기 위해서 사용된다.

응답 데이터가 rsdata.of 에 넣은것으로 바뀌게

filterChain을 커스텀했던 곳에 마찬가지로 exceptionHandling을 추가시키고 ApiAuthenticationEntryPoint를 등록해줌으로서 403오류가 발생시 커스텀한 body가 나오게 된다.

403 오류가 발생했을 때 커스텀한 모습으로 바뀐 모습


추가로 다른 오류 예외처리

하지만 오류는 403 에러만 존재하는 것이 아니기 때문에 다른 오류에 대해서도 추가 작업을 통해서 RestController에서 발생한 예외에 대한 제어권을 가로챈다.

  • 에러 종류가 하나가 아니기 때문에 403 만 처리하면 애초에 통일 시키려는 문제가 해결 된 것이 아니기 때문에 전체적인 예외를 처리시킨다.
@RestControllerAdvice(annotations = {RestController.class}) // 모든 @RestController 에서 발생한 예외에 대한 제어권을 가로챈다.
public class ApiGlobalExceptionHandler {

    //Controller에서 사용했던 valid 폼에 맞지 않는 경우
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseStatus(NOT_FOUND)
    public RsData<String> errorHandler(MethodArgumentNotValidException exception) {
        String msg = exception
                .getBindingResult()
                .getAllErrors()
                .stream()
                .map(DefaultMessageSourceResolvable::getDefaultMessage)
                .collect(Collectors.joining("/"));

        String data = exception
                .getBindingResult()
                .getAllErrors()
                .stream()
                .map(DefaultMessageSourceResolvable::getCode)
                .collect(Collectors.joining("/"));

        return RsData.of("F-MethodArgumentNotValidException", msg, data);
    }

    //json 파싱도 안되는 경우
    @ExceptionHandler(RuntimeException.class)
    @ResponseStatus(INTERNAL_SERVER_ERROR)
    public RsData<String> errorHandler(RuntimeException exception) {
        String msg = exception.getClass().toString();

        String data = exception.getMessage();

        return RsData.of("F-RuntimeException", msg, data);
    }
}
profile
열심히하자
post-custom-banner

0개의 댓글