Spring Cloud Gateway — настройка собственного RemoteTokenService

Раньше я использовал шлюз 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-процентная безопасность рабочей среды не имеет значения.


person MagicLegend    schedule 02.06.2019    source источник