使用仅承载保护 Spring 云网关

Securing Spring Cloud Gateway with bearer-only

我目前想使用 Spring 云网关来保护我的微服务架构。 FrontEnd 向 Keycloak 服务器验证自己的身份,然后在每个请求中发送令牌。 现在的情况是只对外暴露网关,对外将无法访问到各个服务。

如何在 keycloak 服务器上验证不记名令牌?

我在互联网上搜索了一段时间,但还没有找到任何验证令牌的地方。在任何地方,身份验证都是通过网关完成的,然后由各个服务验证令牌。但是,当我将网关声明为 OAuth2 资源服务器时,整个过程都不​​起作用。

我设法让它工作了。

我的安全配置如下:

@Configuration
@EnableWebFluxSecurity
public class SecurityConfig {
    @Bean
    public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
        http.authorizeExchange(exchanges -> exchanges.anyExchange().authenticated())
                .oauth2ResourceServer().jwt();
        http.csrf().disable();
        return http.build();
    }

}

此外,我添加了一个 CorsFilter,但这不是必需的:

@Configuration
public class PreFlightCorsConfiguration {

    @Bean
    public CorsWebFilter corsFilter() {
        return new CorsWebFilter(corsConfigurationSource());
    }

    @Bean
    CorsConfigurationSource corsConfigurationSource() {
        final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration().applyPermitDefaultValues();
        config.addAllowedMethod( HttpMethod.GET);
        config.addAllowedMethod( HttpMethod.PUT);
        config.addAllowedMethod( HttpMethod.POST);
        config.addAllowedMethod( HttpMethod.OPTIONS);
        config.addAllowedMethod(HttpMethod.DELETE);
        source.registerCorsConfiguration("/**", config);
        return source;
    }
}

我使用的安全依赖是:

  <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-oauth2-client</artifactId>
  </dependency>
  <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
  </dependency>
  <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-security</artifactId>
     <version>2.2.5.RELEASE</version>
  </dependency>