В моем проекте есть ряд интеграционных тестов, в которых используются 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?

0
Space Cadet 30 Май 2019 в 15:14

2 ответа

Лучший ответ

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

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

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

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

1
imvishalpatel18 31 Май 2019 в 07:29

Спасибо, первая ссылка, которую вы разместили, была очень полезной. Это мой рабочий код для 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);
}
0
Space Cadet 31 Май 2019 в 14:16