Доступ к эндпоинтам Java Spring Reactive WebFlux со списка разрешенных IP адресов/подсетей

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Очевидный пример состоит в использовании метода hasIpAddress(), однако данный метод в параметрах принимает всего лишь один IP адрес/подсеть:

@Configuration
@EnableWebFluxSecurity
@RequiredArgsConstructor
public class WebSecurity {
    @Bean
    public SecurityWebFilterChain filterNotificationEndpoint(final ServerHttpSecurity http) {
        return http.securityMatcher(new PathPatternParserServerWebExchangeMatcher("/api/endpoint1"))
                .authorizeExchange(exchange -> exchange.pathMatchers("/api/endpoint1")
                        .hasIpAddress("10.0.0.1/8"))
                .build();
    }
}

Рассмотрим случай, когда требуется ограничить работу эндпоинта по списку IP адресов/подсетей. Допустим, список задается в Spring конфиге application.yaml:

application:
  ip-whitelist:
    endpoint1IpWhiteList: 
      - 10.0.0.1/8
      - 11.0.0.1/8

Конфиг класс:

@ConfigurationProperties(prefix = "application.ip-whitelist")
@Component
@Getter
@Setter
@NoArgsConstructor
public class IpWhiteListProperties {
    private List<String> endpoint1IpWhiteList;
}

В итоге, получаем следующую конфигурацию ограничения доступа по списку:

@Bean
public SecurityWebFilterChain filterNotificationEndpoint(final ServerHttpSecurity http) {
    var ipAddressListMatcher = new OrServerWebExchangeMatcher(
            ipWhiteListProperties.getEndpoint1IpWhiteList()
                    .map(IpAddressServerWebExchangeMatcher::new)
                    .collect(Collectors.toList()));
    return http.securityMatcher(new PathPatternParserServerWebExchangeMatcher("/api/endpoint1"))
            .authorizeExchange(exchange -> {
                exchange.pathMatchers("/api/endpoint1")
                        .access((authentication, context) -> Mono.just(context.getExchange())
                                .flatMap(ipAddressListMatcher::matches)
                                .map(matchResult -> new AuthorizationDecision(matchResult.isMatch())));
            })
            .build();
}

Источник: https://habr.com/ru/articles/793300/


Интересные статьи

Интересные статьи

Несколько лет назад я принимал активное участие в разработке твиков для iOS. Я создал множество продуктов и инструментов, распространяемых в Cydia, которые изменяли поведение системы iOS и д...
Привет, друзья! В этой небольшой статье я хочу рассказать вам о File System Access API (далее — FSA), позволяющем читать и записывать файлы в локальную систему пользователя с помощью браузера. ...
Введение Привет, друзья! Представляю вашему вниманию результаты небольшого исследования, посвященного очистке данных, хранящихся на стороне клиента по сигналу сервера. Речь идет об относительно ...
Насколько хорошо вы знаете JavaScript? Вы стремитесь подняться на следующую ступень карьерной лестницы?Я составил викторину из 10 вопросов по JavaScript. Посмотрим, сможете ли вы ответить...
Много лет подряд я, помимо всего прочего, занимался настройкой MVVM в своих рабочих и не очень рабочих проектах. Я увлеченно делал это в Windows-проектах, где паттерн является родны...