Как настроить TestRestTemplate для использования хранилища ключей? - PullRequest
0 голосов
/ 30 мая 2019

В моем проекте есть ряд интеграционных тестов, в которых используются TestRestTemplate и MockMvc.Они проходили успешно.

Я добавил в свой проект зависимости Spring Boot Starter Security и Spring Security OAuth2 Autoconfigure.Я добавил пользовательский класс, который расширяет WebSecurityConfigurerAdapter, чтобы разрешить открытый доступ (на данный момент) к моей заявке.Вот класс

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity
            .authorizeRequests()
            .anyRequest()
            .permitAll();
    }

    @Override
    public void configure(WebSecurity webSecurity) {
        webSecurity
            .ignoring()
            .antMatchers(HttpMethod.OPTIONS, "/**");
    }
}

Приложение также должно действовать как OAuth2 Resource Server, поэтому я также пометил свой основной класс с помощью @EnableResourceServer.Я предоставляю путь к хранилищу доверенных ключей в качестве параметров запуска при запуске приложения.-Djavax.net.ssl.trustStore=<where the cert is stored locally> -Djavax.net.ssl.trustStorePassword=<the password>

Приложение работает нормально, но теперь все интеграционные тесты не пройдены.Вот пример ошибки, общей для всех тестов, использующих TestRestTemplate

Could not fetch user details: class org.springframework.web.client.ResourceAccessException, I/O error on GET request for <the path to my userinfo URL>: 
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: 
unable to find valid certification path to requested target; nested exception is javax.net.ssl.SSLHandshakeException: 
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Кажется, что TestRestTemplate, который я использую для своих тестов, должен быть проинструктирован использовать то же хранилище ключей, что иприложение делает.Можно ли сделать это?Как это будет работать для MockMvc?

Ответы [ 2 ]

1 голос
/ 31 мая 2019

Я думаю, что вам также может понадобиться передать параметры -Djavax.net.ssl.trustStore = -Djavax.net.ssl.trustStorePassword = во время выполнения тестов.Для запуска аргументов одиночного тестового прохода в конфигурации и в maven вы также можете передать эти параметры.

Ниже две ссылки могут помочь

Указание информации хранилища доверия в весенней загрузке application.properties

http://codeboarding.com/tag/testresttemplate/

0 голосов
/ 31 мая 2019

Спасибо, первая опубликованная вами ссылка была очень полезной.Это мой рабочий код для RestTemplate, который принимает любой сертификат, если кто-то найдет его полезным.Это все еще зависит от наличия токенов, но это уже другая история.

private RestTemplate buildRestTemplate() throws Exception {
    SSLContext sslContext = new SSLContextBuilder()
        .loadTrustMaterial(
            new TrustSelfSignedStrategy()
        ).build();
    SSLConnectionSocketFactory socketFactory =
        new SSLConnectionSocketFactory(sslContext);
    HttpClient httpClient = HttpClients.custom()
        .setSSLSocketFactory(socketFactory).build();
    HttpComponentsClientHttpRequestFactory factory =
        new HttpComponentsClientHttpRequestFactory(httpClient);
    return new RestTemplate(factory);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...