我以前在我的微服务环境中使用Zuul网关。我已经建立了自己的OAUTH2服务,该服务使用Spring Security OAUTH2库进行配置。在Zuul中,我发现了使用远程令牌服务的“窍门”,它指向我的内部OAUTH2服务。 (下面的配置类)这就像一个魅力。
现在,我还必须将Websockets用于另一个(网络)应用程序。我已经找到zuul doesn't support websockets,但我不知道该如何升级到zuul 2(我无法运行示例OAUTH2项目)。
因此,我转向了新的Spring Cloud Gateway,该网关应该支持websocket。但是,现在我正在重新配置网关,似乎无法弄清楚如何配置它以使用自己的资源服务器。
我使用/尝试过的代码:
我原始的RemoteTokenService配置。这些值存储在.env文件中,并且uri指向zuul + /api/oauth/token
。
@Configuration
public class OAuth2ResourceServerConfigRemoteTokenService extends ResourceServerConfigurerAdapter {
@Value("${security.oauth2.client.client-id}")
private String clientId;
@Value("${security.oauth2.client.client-secret}")
private String clientSecret;
@Value("${security.oauth2.token.uri}")
private String tokenUrl;
@Override
public void configure(final HttpSecurity http) throws Exception {
// @formatter:off
//TODO: Check what this exactly does (forces the need of a session?)
http.cors().and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
.and()
.authorizeRequests().anyRequest().permitAll();
// @formatter:on
}
/**
* Tells OAuth where the tokens should be validated.
* In our case this is the authservice, which is routed through Zuul via the application.properties.
*/
@Primary
@Bean
public RemoteTokenServices tokenServices() {
final RemoteTokenServices tokenService = new RemoteTokenServices();
tokenService.setCheckTokenEndpointUrl(tokenUrl);
tokenService.setClientId(clientId);
tokenService.setClientSecret(clientSecret);
return tokenService;
}
}
我尝试过的是在网关中使用此过滤器:
@Bean
SecurityWebFilterChain springWebFilterChain(ServerHttpSecurity http) throws Exception {
return http
.csrf().disable()
.authorizeExchange()
.pathMatchers("/oauth/**")
.permitAll()
.and()
.authorizeExchange()
.pathMatchers("/users/**")
.authenticated()
.anyExchange().permitAll()
.and()
.build();
}
但是,当我尝试访问/ users /端点上的任何内容时,我会收到401;因为网关不知道应该在哪里以及如何检查它获得的令牌。
请注意,我不使用JWT令牌,而是使用UUID(我猜是默认配置)。因此,.oauth2ResourceServer().jwt()
似乎不适用。对于.oauth2ResourceServer().bearerTokenConverter()
应该做什么,我似乎找不到任何有用的资料,docs却没有提及。
我希望Cloud Gateway不必考虑它,而只是向authservice发送请求以验证令牌。我试图复制上述的RemoteTokenService
配置,但是这使我陷入了一个无法摆脱的依赖地狱。
如何配置网关以使用自己的授权服务器?
注意:这是一个学校项目,因此100%的生产安全性不重要。