我正在尝试将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
然后我得到相同的错误。
任何帮助将不胜感激!