Настройка безопасности Spring: Basi c Auth + Spring Cloud Gateway - PullRequest
1 голос
/ 09 марта 2020

У меня есть приложение Reactive Spring Boot, которое отвечает за маршрутизацию запросов к нисходящим сервисам, используя Spring Cloud Gateway (то есть это API-шлюз). Приложение имеет некоторые конечные точки привода, которые необходимо защитить, поэтому я хочу использовать для этого просто простую защиту, такую ​​как basi c auth.

Я хотел бы настроить приложение, чтобы запрашивать запросы Авторизация /actuator/refresh с использованием аутентификации basi c (с настроенным пользователем и паролем безопасности Spring). Все запросы к другим конечным точкам, , даже если они включают basi c auth , необходимо передавать только в нисходящую службу.

Моя текущая конфигурация безопасности Spring:

@Bean
@Order(1)
SecurityWebFilterChain securityWebFilterChain(final ServerHttpSecurity http) {
    http.authorizeExchange(exchanges -> {
        exchanges.matchers(EndpointRequest.toAnyEndpoint().excluding(HealthEndpoint.class, InfoEndpoint.class)).hasRole("ACTUATOR"); // requires Http Basic Auth
    });
    http.httpBasic(withDefaults()); // if not enabled, you cannot get the ACTUATOR role
    return http.build();
}

@Bean
@Order(2)
SecurityWebFilterChain permitAllWebFilterChain(final ServerHttpSecurity http) {
    http.authorizeExchange(exchanges -> exchanges.anyExchange().permitAll()); // allow unauthenticated access to any endpoint (other than secured actuator endpoints?)
    http.httpBasic(ServerHttpSecurity.HttpBasicSpec::disable); // disable Http Basic Auth for all other endpoints
    return http.build();
}

Запрос, предназначенный для нисходящего сервиса, не распространяется шлюзом API. Служба весенней загрузки возвращает 401 в этой настройке, в то время как ожидается / требуется 200.

Есть идеи, почему эта конфигурация не работает / как ее следует настроить в противном случае?

1 Ответ

0 голосов
/ 10 марта 2020

Я не уверен, что сломано, но вы пытались объединить их и иметь только один фильтр?

@EnableWebFluxSecurity
public class MyExplicitSecurityConfiguration {

    @Bean
    public MapReactiveUserDetailsService userDetailsService() {
        UserDetails user = User.withDefaultPasswordEncoder()
            .username("user")
            .password("user")
            .roles("ACTUATOR")
            .build();
        return new MapReactiveUserDetailsService(user);
    }

    @Bean
    SecurityWebFilterChain securityWebFilterChain(final ServerHttpSecurity http) {
        http.authorizeExchange(exchanges -> {
            exchanges.matchers(EndpointRequest.toAnyEndpoint()
                                              .excluding(HealthEndpoint.class, InfoEndpoint.class))
                                              .hasRole("ACTUATOR");
            exchanges.anyExchange().permitAll();
        }).httpBasic(withDefaults());
        return http.build();
    }
}

еще одна хорошая вещь - включить ведение журнала отладки и посмотреть, что не получается.

это делается путем определения в application.properties

logging.level.org.springframework.security=DEBUG
...