Раньше я использовал шлюз Zuul для своей среды микросервисов. Я настроил свою собственную службу OAUTH2, которая использует библиотеку Spring Security OAUTH2 для своей конфигурации. В Zuul я нашел «хитрость» для использования службы удаленных токенов, которая указывала на мою внутреннюю службу OAUTH2. (класс конфигурации ниже) Это сработало как шарм.
Теперь мне также нужно использовать веб-сокеты для другой части (веб-приложения). Я обнаружил, что zuul не поддерживает веб-сокеты, и я не мог понять, как мне перейти к обновлению на zuul 2 (мне не удалось запустить пример проекта OAUTH2).
Поэтому я обратился к новому Spring Cloud Gateway, который должен поддерживать веб-сокеты. Но теперь я работаю над перенастройкой шлюза и, похоже, не могу понять, как мне настроить его для использования моего собственного сервера ресурсов.
Код, который я использовал/пробовал:
Моя исходная конфигурация 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()
, документы не упоминайте об этом.
Я хочу, чтобы облачный шлюз не думал об этом, а просто отправлял запрос в службу авторизации для проверки токена. Я пытался скопировать вышеупомянутую конфигурацию RemoteTokenService
, но это бросает меня в ад зависимостей, из которого я не могу найти выход.
Как настроить шлюз для использования моего собственного сервера авторизации?
Примечание. Это школьный проект, поэтому 100-процентная безопасность рабочей среды не имеет значения.