Spring Cloud Gateway всегда отсылает обратно HTTP-статус 503, как это исправить? - PullRequest
0 голосов
/ 31 марта 2019

Я пытаюсь использовать Spring Cloud Gateway с Spring Security.Но, к сожалению, похоже, что безопасность на самом деле не имеет значения, и все запросы проходят через ее места назначения или, по крайней мере, пытаются.Просто пытается, потому что я получаю HTTP-статус 503 каждый раз.Я нахожусь на весне 5, и стараюсь быть максимально «реактивным».Что я делаю неправильно?В журнале нет ничего интересного, только обычные строки, когда служба пытается найти пункт назначения с помощью балансировки нагрузки ленты.Я также включил журнал доступа на сервере шлюза, надеясь получить некоторую дополнительную информацию, но ничего.

Я упростил свой код, и здесь приведена минимальная конфигурация, которая не работает.

POM-зависимости и управление зависимостями:

    <dependencies>
        <!-- Spring Cloud Gateway service -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

        <!-- Spring Cloud Eureka client -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <!-- Spring Cloud config client -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- Spring Security -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

bootstrap.yml:

spring:
  application:
    name: gateway-server
  cloud:
    config:
      name: gateway-server
      username: configUser
      password: configPassword
      discovery:
        enabled: true
        service-id: config-server
eureka:  
  client:
    serviceUrl:
      defaultZone: http://discUser:discPassword@localhost:9002/eureka/
  instance:
    leaseRenewalIntervalInSeconds: 1
    leaseExpirationDurationInSeconds: 2

Безопасностьconfig:

@Configuration
@EnableWebFluxSecurity
public class SecurityConfig  {

    private static final Logger LOGGER = LoggerFactory.getLogger(SecurityConfig.class);

    @Bean
    public ReactiveUserDetailsService userDetailsService() {
        UserDetails user1 = User.withDefaultPasswordEncoder()
            .username("discUser")
            .password("discPassword")
            .roles("SYSTEM", "USER")
            .build();

        return new MapReactiveUserDetailsService(user1);
    }

    @Bean
    public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
        LOGGER.info("TEMP_LOG: Test");
            return http
                .csrf()
                    .disable()
                .httpBasic()
                    .and()
                .authorizeExchange()
                    .pathMatchers("/eureka/**")
                        .hasRole("SYSTEM")
                    .pathMatchers("/eureka/css/**", "/eureka/js/**")
                        .permitAll()
                            .and()
                .build();
    }
}

Определения маршрута шлюза:

@SpringBootApplication
@ComponentScan(basePackages = {"com.besztercekk.tao.gateway"})
@EnableDiscoveryClient
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }

    @Autowired
    @Bean
    RouteLocator customRoutes(RouteLocatorBuilder builder, LoggingFilter loggingFilter) {
        return builder.routes()
            .route("eureka", r -> r.path("/eureka")
                .filters(f -> {
                    f.filter(loggingFilter);
                    return f;
                }).uri("lb://discovery-server:9002"))
            .build();
    }
}

Если я позвоню в службу шлюза из браузера (без имени пользователя), я быожидайте форму входа в систему, или, по крайней мере, 403, потому что я не определяю пользователя, поэтому безопасность на самом деле не может сделать свою работу.

Но я получаю только страницу отката ошибки, говорящую:

Вс 31 марта 11:46:42 UTC 2019 Произошла непредвиденная ошибка (тип = Сервис недоступен, статус = 503).Служба или элемент не был найден.

Если я вызову этот шлюз из командной строки, например, с помощью curl, например:

curl --user discUser:discPassword http://localhost:8080/eureka

, тогда я получута же ошибка.

Любая помощь будет оценена!

...