使用仅承载保护 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>
我目前想使用 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>