Spring Cloud网关总是发回HTTP状态503,如何解决?

时间:2019-03-31 14:15:04

标签: spring-boot spring-cloud spring-cloud-gateway

我正在尝试将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

安全配置:

@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,因为我没有定义用户,所以安全性无法真正发挥作用。 / p>

但是我只得到错误回退页面说:

  

2019年3月31日星期日11:46:42 UTC   发生意外错误(类型=服务不可用,状态= 503)。   找不到服务或项目。

如果我从命令行调用该网关,例如像这样卷曲:

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

然后我得到相同的错误。

任何帮助将不胜感激!

0 个答案:

没有答案