Маршрутизация Spring Cloud Gateway YML - есть ли способ проверить разрешения? - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть несколько микросервисов и шлюз, использующий Spring Cloud. Я пытаюсь настроить маршрутизацию в шлюзе. В идеале я хотел бы настроить маршрутизацию в файле YML или с помощью компонента RouteLocator.

Но в настоящее время в моем шлюзе у меня есть конечные точки REST для каждого маршрута, который просто отправляет запрос вперед, используя a WebClient.

(До этого у меня был фильтр ReactiveAuthenticationManager, который проверяет токен JWT. Он возвращает UsernamePasswordAuthenticationToken, который включает в себя некоторые полномочия пользователя, которые он получает из токена).

Вот пример где я установил маршрут к микросервису, который называется службой отслеживания:

Контроллер:

@RestController
@RequestMapping("/tracking-service/tracking")
public class TrackingController {

  @Autowired
  private TrackingService trackingService;

  @GetMapping
  public Flux getAllTracking() {
    return trackingService.getAllTracking();
  }

}

Служба:

@Service
public class TrackingService {

  private WebClient webClient;

  @PreAuthorize("hasAuthority('MANAGER')")
  public Flux getAllTracking() {
    //Make HTTP call to the tracking service
  }

}

Причина, по которой я это сделал путь из-за аннотации @PreAuthorize. Если клиентский токен JWT не включает токен «МЕНЕДЖЕР», то он вернет 403 запрещенного статуса. Не для всех конечных точек требуются полномочия MANAGER, а для некоторых конечных точек требуются другие полномочия.

Мой вопрос - возможно ли это сделать при маршрутизации с YML? Я надеялся увидеть что-то похожее на это, но я не уверен, что это возможно? Я прочитал документы Spring и посмотрел все доступные фильтры, и не было ничего, что могло бы выполнить эту работу, которую я мог видеть.

spring:
  cloud:
    gateway:
      routes:
        - id: tracking
          uri: http://tracking-service
          predicates:
            - Path=/tracking-service/**
          filters:
            - StripPrefix=1
            - PreAuthorize=hasAuthority('MANAGER')

Спасибо.

...