Я использовал шлюз Zuul для своей микросервисной среды. Я настроил свою собственную службу OAUTH2, которая использует библиотеку Spring Security OAUTH2 для своей конфигурации. В Zuul я нашел «хитрость» в использовании удаленной службы токенов, которая указывала на мою внутреннюю службу OAUTH2. (класс конфигурации ниже) Это работает как шарм.
Теперь я также должен использовать Websockets для другого компонента (веб) приложения. Я обнаружил, что zuul не поддерживает websockets , и я не мог понять, как мне перейти к обновлению до 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 / endpoint, я получаю 401; потому что шлюз не знает, где и как он должен проверить полученный токен.
Обратите внимание, что я использую не токен JWT, а UUID (я думаю, конфигурация по умолчанию). .oauth2ResourceServer().jwt()
кажется неприменимым из-за этого. Кажется, я не могу найти каких-либо полезных источников относительно того, что .oauth2ResourceServer().bearerTokenConverter()
должен делать, документы не упоминают об этом.
Я хочу, чтобы Cloud Gateway не думал об этом, а просто отправил запрос в службу аутентификации для проверки токена. Я пытался скопировать вышеупомянутый RemoteTokenService
конфиг, но это бросает меня в ад зависимости, из которого я не могу найти выход.
Как настроить шлюз на использование моего собственного сервера авторизации?
Примечание: Это школьный проект, поэтому 100% безопасность производства не имеет значения.