RestTemplate с дайджест-аутентификацией
1. обзор
Эта статья покажет, какconfigure the Spring RestTemplate to consume a service secured with Digest Authentication.
Подобно базовой аутентификации, как только дайджест-аутентификация будет установлена в шаблоне, клиент сможет пройти необходимые шаги безопасности и получить информацию, необходимую для заголовкаAuthorization:
Authorization: Digest
username="user1",
realm="Custom Realm Name",
nonce="MTM3NTYwOTA5NjU3OTo5YmIyMjgwNTFlMjdhMTA1MWM3OTMyMWYyNDY2MGFlZA==",
uri="/spring-security-rest-digest-auth/api/foos/1",
....
С этими данными сервер может правильно аутентифицировать запрос и вернуть ответ 200 OK.
2. НастройтеRestTemplate
RestTemplate необходимо объявить какa bean in the Spring context - это достаточно просто либо в XML, либо на простой Java, используя аннотацию@Bean:
import org.apache.http.HttpHost;
import org.example.client.HttpComponentsClientHttpRequestFactoryDigestAuth;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class ClientConfig {
@Bean
public RestTemplate restTemplate() {
HttpHost host = new HttpHost("localhost", 8080, "http");
CloseableHttpClient client = HttpClientBuilder.create().
setDefaultCredentialsProvider(provider()).useSystemProperties().build();
HttpComponentsClientHttpRequestFactory requestFactory =
new HttpComponentsClientHttpRequestFactoryDigestAuth(host, client);
return new RestTemplate(requestFactory);;
}
private CredentialsProvider provider() {
CredentialsProvider provider = new BasicCredentialsProvider();
UsernamePasswordCredentials credentials =
new UsernamePasswordCredentials("user1", "user1Pass";
provider.setCredentials(AuthScope.ANY, credentials);
return provider;
}
}
Большая часть настройки механизма доступа к дайджесту выполняется в пользовательской реализации фабрики HTTP-запросов клиента, внедренной в шаблон -HttpComponentsClientHttpRequestFactoryDigestAuth.
Обратите внимание, что сейчас мы предварительно настраиваем шаблон с учетными данными, которые имеют доступ к защищенному API.
3. Настроить дайджест-аутентификацию
Мы собираемся использовать поддержку, представленную в Spring 3.1 для текущего HttpClient 4.x, а именноHttpComponentsClientHttpRequestFactory, путем ее расширения и настройки.
В основном мы собираемся настроитьHttpContext и подключить нашу собственную логику для дайджест-аутентификации:
import java.net.URI;
import org.apache.http.HttpHost;
import org.apache.http.client.AuthCache;
import org.apache.http.client.protocol.ClientContext;
import org.apache.http.impl.auth.DigestScheme;
import org.apache.http.impl.client.BasicAuthCache;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;
import org.springframework.http.HttpMethod;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
public class HttpComponentsClientHttpRequestFactoryDigestAuth
extends HttpComponentsClientHttpRequestFactory {
HttpHost host;
public HttpComponentsClientHttpRequestFactoryDigestAuth(HttpHost host) {
super(httpClient);
this.host = host;
}
@Override
protected HttpContext createHttpContext(HttpMethod httpMethod, URI uri) {
return createHttpContext();
}
private HttpContext createHttpContext() {
// Create AuthCache instance
AuthCache authCache = new BasicAuthCache();
// Generate DIGEST scheme object, initialize it and add it to the local auth cache
DigestScheme digestAuth = new DigestScheme();
// If we already know the realm name
digestAuth.overrideParamter("realm", "Custom Realm Name");
authCache.put(host, digestAuth);
// Add AuthCache to the execution context
BasicHttpContext localcontext = new BasicHttpContext();
localcontext.setAttribute(ClientContext.AUTH_CACHE, authCache);
return localcontext;
}
}
ТеперьRestTemplate можно просто ввести и использовать в тесте:
@Test
public void whenSecuredRestApiIsConsumed_then200OK() {
String uri = "http://localhost:8080/spring-security-rest-digest-auth/api/foos/1";
ResponseEntity entity = restTemplate.exchange(uri, HttpMethod.GET, null, Foo.class);
System.out.println(entity.getStatusCode());
}
Чтобы проиллюстрировать полный процесс настройки, этот тест также устанавливает учетные данные пользователя -user1 иuser1Pass. Эта часть, конечно, должна быть выполненаonly once and outside the test itself.
4. Maven Зависимости
Необходимые зависимости Maven дляRestTemplate и библиотеки HttpClient:
org.springframework
spring-webmvc
4.1.1.RELEASE
org.apache.httpcomponents
httpclient
4.3.5
5. Заключение
В этом руководстве показано, как настроить иconfigure the Rest Template so that it can consume an application secured with Digest authentication. Сам REST API должен быть механизмомconfigured with the digest security.
Реализацию можно найти вthe example GitHub project - это проект на основе Maven, поэтому его должно быть легко импортировать и запускать как есть.