Как реализовать проверку заголовка авторизации с помощью WebFilter

#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. Спасибо за ответ. Как вы сказали, я должен связать инструкции, и это работает