기본적으로 SpringSecurity에 403 오류 양식이 존재한다.
근데 그게 마음에 들지 않거나 다르게 만들고 싶을 때 커스터마이징을 진행한다.
SpringSecurity에 exceptionHandling을 통해서 오류가 발생시 예외를 따로 처리한다.
추가로 ApiAuthenticationEntryPoint를 만든다.
-> 인증 예외가 생길경우 의미가 생기는 클래스 (인증 예외가 발생시 어떻게 할 것인지 결정하게 만듬)
응답 데이터가 rsdata.of 에 넣은것으로 바뀌게
filterChain을 커스텀했던 곳에 마찬가지로 exceptionHandling을 추가시키고 ApiAuthenticationEntryPoint를 등록해줌으로서 403오류가 발생시 커스텀한 body가 나오게 된다.
403 오류가 발생했을 때 커스텀한 모습으로 바뀐 모습
추가로 다른 오류 예외처리
하지만 오류는 403 에러만 존재하는 것이 아니기 때문에 다른 오류에 대해서도 추가 작업을 통해서 RestController에서 발생한 예외에 대한 제어권을 가로챈다.
@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);
}
}