У меня есть несколько микросервисов и шлюз, использующий 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')
Спасибо.