Я настроил необходимые bean-компоненты следующим образом:
Конфигурация безопасности
Код: Выделить всё
@Configuration
@EnableWebSecurity
public class SecurityConfiguration {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests(authorize -> authorize
.requestMatchers("/", "/public/**").permitAll()
.anyRequest().permitAll())
.oauth2Client(withDefaults());
return http.build();
}
}
Код: Выделить всё
@Configuration
public class ClientRegistrationConfig {
@Bean
public ClientRegistrationRepository clientRegistrationRepository(ConfigModel configModel) {
ClientRegistration clientRegistration = ClientRegistration.withRegistrationId("my-oauth2-client")
.tokenUri(configModel.getGatewayAuthTokenUri())
.clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_BASIC)
.clientId(configModel.getGatewayAuthClientId())
.clientSecret(configModel.getGatewayAuthClientSecret())
.authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS)
.scope("openid")
.build();
return new InMemoryClientRegistrationRepository(clientRegistration);
}
}
Код: Выделить всё
public class RestTemplateConfig {
@Bean(name = "gatewayRestTemplate")
public RestTemplate gatewayRestTemplate(
RestTemplateBuilder builder,
OAuth2AuthorizedClientManager authorizedClientManager,
ClientRegistrationRepository clientRegistrationRepository) {
ClientRegistration clientRegistration = clientRegistrationRepository.findByRegistrationId("my-oauth2-client");
ClientHttpRequestInterceptor interceptor = new OAuth2ClientInterceptor(authorizedClientManager, clientRegistration);
RequestConfig requestConfig = RequestConfig.custom()
.setConnectionRequestTimeout(10000, TimeUnit.MILLISECONDS)
.setResponseTimeout(10000, TimeUnit.MILLISECONDS)
.build();
CloseableHttpClient httpClient = HttpClients.custom()
.setDefaultRequestConfig(requestConfig)
.build();
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient);
factory.setConnectTimeout(Duration.ofMillis(13000));
return builder
.requestFactory(() -> factory)
.additionalInterceptors(interceptor) // Adding a custom interceptor for setting the x-access-token
.build();
}
}
Код: Выделить всё
public class OAuth2ClientInterceptor implements ClientHttpRequestInterceptor {
private final OAuth2AuthorizedClientManager manager;
private final ClientRegistration clientRegistration;
public OAuth2ClientInterceptor(OAuth2AuthorizedClientManager manager, ClientRegistration clientRegistration) {
this.manager = manager;
this.clientRegistration = clientRegistration;
}
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
request.getHeaders().set("x-access-token", getAccessToken());
return execution.execute(request, body);
}
private String getAccessToken() {
OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest
.withClientRegistrationId(clientRegistration.getRegistrationId())
.principal(clientRegistration.getClientId())
.build();
OAuth2AuthorizedClient client = manager.authorize(authorizeRequest);
Assert.notNull(client, () -> "Authorized client failed for Registration id: '" + clientRegistration.getRegistrationId() + "', returned client is null");
return client.getAccessToken().getTokenValue();
}
}
Это исключение происходит из метода авторизации() DefaultOAuth2AuthorizedClientManager
Я также исследовал подходы RestClient и WebClient, но переход на них требует более масштабного рефакторинга, которого я бы хотел пока избежать.
Я уже упоминал следующие ресурсы, но не смог найти решение, специфичное для Spring Batch.
Документация клиента Spring Security OAuth2
Проблема безопасности Spring 13588Перехватчик OAuth2 RestClient
Как настроить OAuth2AuthorizedClientManager или решить проблему servletRequest, чтобы этот подход на основе перехватчика работал в Spring Batch?
/>Любые предложения или альтернативные решения, которые хорошо работают в этом контексте, приветствуются!
Подробнее здесь: https://stackoverflow.com/questions/792 ... late-inter
Мобильная версия