Я создал следующий пользовательский фильтр, который будет использоваться для авторизации в приложении Spring Cloud. Вот метод apply()
из этого фильтра, из которого выдается исключение в случае неудачной проверки авторизации:
@Override
public GatewayFilter apply(Config config) {
return (exchange, chain) -> {
HttpStatus status = HttpStatus.FORBIDDEN;
try {
String authRequest = exchange.getRequest().getHeaders().getFirst(
Constants.SESSION_HEADER_NAME);
HttpHeaders headers = new HttpHeaders();
HttpEntity<String> entity = new HttpEntity<String>(authRequest, headers);
// make REST call to authorization module
status = restTemplate.postForEntity(authURL, entity, String.class).getStatusCode();
}
catch (Exception e) {
LOGGER.error("Something went wrong during authorization", e);
}
// throw an exception if anything went
// wrong with authorization
if (!HttpStatus.OK.equals(status)) {
throw new ResponseStatusException(HttpStatus.FORBIDDEN);
}
return chain.filter(exchange);
};
}
Я определил следующий класс @ControllerAdvice
для перехвата всех исключений, генерируемых вышеуказанным фильтром Gateway Cloud:
@ControllerAdvice
public class RestExceptionHandler {
@ExceptionHandler(value = ResponseStatusException.class)
public final ResponseEntity<Object> handleException(ResponseStatusException ex) {
return new ResponseEntity<>("UNAUTHORIZED", HttpStatus.FORBIDDEN);
}
}
В настоящее время я наблюдаю следующее:
- Вышеуказанный пользовательский фильтр
ResponseStatusException
- это , а не , перехваченный методом отображения @ControllerAdvice
.
- Тем не менее, выбрасывая это исключение из другого места в приложении Spring Boot, например обычный контроллер, который мы используем в качестве конечной точки аутентификации, - это , перехваченный методом
@ControllerAdvice
.
Пока что это больше неприятность, чем блокировщик, потому что на самом деле выбрасывание ResponseStatusException
из фильтра Cloud с пользовательским кодом ошибки фактически возвращает этот код ошибки вызывающей стороне. Но было бы неплохо обработать все исключения в одном месте.
Может кто-нибудь пролить свет на эту проблему?