Как реализовать проверку заголовка авторизации с помощью WebFilter - PullRequest
0 голосов
/ 02 апреля 2019

Я новичок в 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 Ответ

0 голосов
/ 03 апреля 2019

Объедините ваш код в одну цепочку вот так:

@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));
}

Если ваш метод авторизации выдает ошибку, цепочка фильтров не будет вызвана.

...