JavaRush /Курсы /Модуль 5. Spring /Лекция 243: Основные функции API Gateway: маршрутизация, ...

Лекция 243: Основные функции API Gateway: маршрутизация, аутентификация, авторизация

Модуль 5. Spring
25 уровень , 2 лекция
Открыта

API Gateway — это как консьерж в гостинице: он принимает все запросы от внешних пользователей, проверяет, кто они такие, решает, куда их отправить, и отвечает за общее управление. Это делает API Gateway центральной точкой контроля между клиентами и микросервисами. В этой лекции мы будем разбираться с основными функциями API Gateway.


Расширенные возможности маршрутизации

Маршрутизация API Gateway — это сердце его работы. Она отвечает за то, чтобы запросы попадали именно к тем микросервисам, которые могут их обработать.

Пример:

Представьте, у вас есть два микросервиса:

  1. Сервис управления пользователями (UserService) по адресу http://localhost:8081.
  2. Сервис заказа товаров (OrderService) по адресу http://localhost:8082.

Вы хотите, чтобы:

  • Запросы на /users/** маршрутизировались в UserService.
  • Запросы на /orders/** — в OrderService.

Настроим это в Spring Cloud Gateway:


@Configuration
public class GatewayConfig {

    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
            .route("user_service_route", r -> r.path("/users/**")
                .uri("http://localhost:8081")) // Маршрутизация в UserService
            .route("order_service_route", r -> r.path("/orders/**")
                .uri("http://localhost:8082")) // Маршрутизация в OrderService
            .build();
    }
}

Теперь API Gateway перенаправляет запросы в зависимости от пути. Это уже круто, но мы можем сделать больше.


Управление аутентификацией и авторизацией

Аутентификация — это проверка, кто вы (например, вход с логином и паролем). Авторизация — это проверка, что вам разрешено делать (например, доступ только к определённым данным).

API Gateway может выполнять аутентификацию и авторизацию несколькими способами:

  1. Проверка токенов (например, JWT).
  2. Интеграция с системами OAuth2/SSO.
  3. Экономия жизни вашего бекенда за счёт отказа неавторизованным запросам ещё на уровне API Gateway.

Расширенные функции маршрутизации

Для сложных сценариев маршрутизации API Gateway поддерживает предикаты и фильтры.

Предикаты (Predicates) используются для определения правил маршрутизации. Например:

  • По пути (Path): маршрутизируй запросы, если их путь соответствует /users/**.
  • По HTTP-методу (Method): только GET запросы.
  • По хосту (Host): например, запросы, пришедшие на api.example.com.

Пример использования предикатов:


@Bean
public RouteLocator advancedRouteLocator(RouteLocatorBuilder builder) {
    return builder.routes()
        .route("user_service", r -> r
            .path("/users/**")
            .and()
            .method("GET") // Только GET-запросы
            .uri("http://localhost:8081"))
        .build();
}

Фильтры (Filters) позволяют обрабатывать запросы и ответы: модифицировать их, добавлять заголовки, проверять параметры и т.д.

Пример: добавим заголовок ко всем запросам:


@Bean
public RouteLocator routeWithFilters(RouteLocatorBuilder builder) {
    return builder.routes()
        .route("order_service", r -> r
            .path("/orders/**")
            .filters(f -> f.addRequestHeader("X-Request-ID", "12345")) // Добавляем заголовок
            .uri("http://localhost:8082"))
        .build();
}

Аутентификация в API Gateway

Работа с аутентификацией — ключевая функция API Gateway в построении безопасных приложений.

JWT (JSON Web Token) — это токен, который клиент отправляет с запросами, а сервер (или API Gateway) проверяет его подлинность, используя секретный ключ. Это удобно, потому что не нужно каждый раз обращаться к базе: токен уже содержит всю информацию.

Пример настройки проверки JWT: Добавляем зависимость в pom.xml:


<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>

Настраиваем конфигурацию:


@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.oauth2ResourceServer()
            .jwt(); // Включаем поддержку JWT
    }
}

Теперь все запросы с токенами будут проверяться.


Авторизация в API Gateway

Авторизация — это наше "а вам туда можно?". Она отвечает за то, чтобы пользователи могли делать только то, что им позволено.

Роли и разрешения

В микросервисной среде роли (например, ADMIN, USER) используются для ограничения функциональности.

Настроим авторизацию с ролями:


@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
        .antMatchers("/admin/**").hasRole("ADMIN") // Только для админов
        .antMatchers("/user/**").hasRole("USER")   // Только для пользователей
        .anyRequest().authenticated();            // Остальные запросы - только для аутентифицированных
}

Управление безопасностью

Кроме аутентификации и авторизации, API Gateway должен защищать от атак, таких как SQL-инъекции, XSS и CSRF.

Защита от CSRF

CSRF (Cross-Site Request Forgery) — это атака, при которой злоумышленник заставляет пользователя выполнить запрос от его имени. Spring Security по умолчанию включает защиту от CSRF для форм.

Для REST API её можно отключить (но с осторожностью!):

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable(); // Отключаем, если используем токены
}

API Gateway может ограничивать число запросов для предотвращения DoS-атак. Например, настроим лимит запросов с помощью фильтров.


Практическое задание

  1. Настройте маршрутизацию для двух микросервисов: /users/** и /orders/**.
  2. Реализуйте JWT-аутентификацию, где пользователи с токенами могут отправить запрос.
  3. Добавьте авторизацию для ограничения доступа:
    • Админы могут выполнять POST на /orders.
    • Пользователи могут только GET на /users.

Мы сделали большой шаг вперёд — от простой маршрутизации к продвинутым сценариям с аутентификацией и авторизацией. API Gateway теперь не только распределяет запросы, но и защищает ваши данные и микросервисы. Двигаемся дальше!

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ