#java #spring-boot #spring-webflux
#java #spring-boot #spring-webflux
Вопрос:
Я новичок в Spring Webflux. Я хочу использовать WebFilter для проверки подлинности. Итак, идея заключается в том, чтобы перехватить запрос, проверить заголовок авторизации и распространить запрос
Вот что я пытался сделать. Я успешно перехватил запрос и проверил, правильный заголовок или нет.
public class AuthWebFilter implements WebFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
log.info("Request {} called", exchange.getRequest().getPath().value());
System.out.println("Tokent authenitcation..");
ServerHttpResponse response = exchange.getResponse();
getAuthorization(exchange.getRequest())
.doOnError(error -> exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED)))
.subscribe(authorization -> System.out.println(authorization));
return chain.filter(exchange);
}
private Mono<String> getAuthorization(ServerHttpRequest request) {
String authorization = request.getHeaders().getFirst(Authorization);
if (StringUtils.isBlank(authorization)) {
return Mono.error(
new UnauthorizedException(
Status.Unauthorized, "The request must provide authorization.", null));
}
return Mono.just(authorization);
}
}
Проблема в том, что я не знаю, как прервать поток, если произойдет ошибка. Хотя код состояния изменен на 401, тело ответа по-прежнему содержит запрошенные данные. Другими словами, запрос считается успешным, но изменяется только код состояния
Кто-нибудь знает, какой шаг я здесь пропускаю?
Ответ №1:
Объедините свой код в одну цепочку, подобную этой:
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
log.info("Request {} called", exchange.getRequest().getPath().value());
System.out.println("Tokent authenitcation..");
ServerHttpResponse response = exchange.getResponse();
return getAuthorization(exchange.getRequest())
.doOnError(error -> exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED)))
.then(chain.filter(exchange));
}
Если ваш метод авторизации выдает ошибку, цепочка фильтров вызываться не будет.
Комментарии:
1. Спасибо за ответ. Как вы сказали, я должен связать инструкции, и это работает