Я пытаюсь использовать 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
, тогда я получута же ошибка.
Любая помощь будет оценена!