В моем проекте есть ряд интеграционных тестов, в которых используются 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 ответа
Я думаю, что вам также может понадобиться передать -Djavax.net.ssl.trustStore = -Djavax.net.ssl.trustStorePassword = во время выполнения тестов. Для запуска одиночных тестовых аргументов в конфигурации и в maven также вы можете передать эти параметры.
Ниже две ссылки могут помочь
Указание информации хранилища доверия в весенней загрузке application.properties
http://codeboarding.com/tag/testresttemplate/
Спасибо, первая ссылка, которую вы разместили, была очень полезной. Это мой рабочий код для 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);
}
Новые вопросы
spring-security
Spring Security - это решение безопасности приложений Spring Framework. Безопасность Spring можно использовать для защиты URL-адресов и вызовов методов. Он широко используется для защиты автономных веб-приложений, портлетов и приложений REST.