使用rewritePath和token relay保护Spring GW路由

wh6knrhe  于 5个月前  发布在  Spring
关注(0)|答案(1)|浏览(57)

我有一个K8S应用程序与Keycloak,SpringGW和后端服务作为资源服务.
现在,它可以在没有authn的情况下工作,但我想使用autz代码流将authn添加到它。
问题是:这是我的API gw中的customRouteLocator,我如何修改它以便添加tokenRelay过滤器?

@EnableWebFluxSecurity
@EnableDiscoveryClient
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                .route("product-service", r -> r.path("/webapi/products/**")
                        .filters(f -> f.rewritePath("/webapi/(?<segment>.*)", "/api/v1/${segment}"))
                        .uri("lb://product-service"))
                .route("order-service", r -> r.path("/webapi/orders/**")
                        .filters(f -> f.rewritePath("/webapi/(?<segment>.*)", "/api/v1/${segment}"))
                        .uri("lb://order-service"))
                .build();
    }

}

字符串

4c8rllxm

4c8rllxm1#

您需要将Spring Cloud Gateway设置为oauth2客户端。

部门:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>

字符串
在application.yaml中将网关定义为OAuth2客户端:

spring:
  security:
    oauth2:
      client:
        provider:
          keycloak:
            issuer-uri: http://[url-to-issuer-in-keycloak]
        registration:
          gateway:
            provider: keycloak
            client-id: gateway
            client-secret: <CLIENT SECRET>
            scope: openid


安全链:

@Configuration
@EnableWebSecurity
public class OAuth2LoginSecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(authorize -> authorize
                .anyRequest().authenticated()
            )
            .oauth2Login(withDefaults());
        return http.build();
    }
}


之后,您可以将token-relay过滤器应用于所有路由。不幸的是,使用编程方法来定义路由,您必须手动将token-relay过滤器应用于所有路由。yaml方法提供了一种可能性,可以定义一次应用于所有路由的默认过滤器:

spring:
  cloud:
    gateway:
      default-filters:
      - TokenRelay

相关问题