Автор оригинала: Eugen Paraschiv.
содержание
- 1. Обзор
- 2. Установка опорной плиты весной
- 3. Ручное управление HTTP-заголовком авторизации
- 4. Автоматическое управление HTTP-заголовком авторизации
- 5. Зависимости Maven
- 6. Заключение
1. Обзор
В этой статье показано, как использовать Spring RestTemplate для использования службы RESTful, защищенной базовой аутентификацией .
Как только для шаблона будет настроена базовая аутентификация, каждый запрос будет отправлен предварительно содержащий полные учетные данные , необходимые для выполнения процесса аутентификации. Учетные данные будут закодированы и будут использовать заголовок Authorization HTTP в соответствии со спецификациями базовой схемы аутентификации. Пример будет выглядеть следующим образом:
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Дальнейшее чтение:
Обработка ошибок пружинной пластины
Использование перехватчика пружинной пластины
Изучение тестовой панели Spring Boot TestRestTemplate
2. Настройка RestTemplate
Загрузка RestTemplate в контекст Spring может быть выполнена простым объявлением компонента для него; однако настройка RestTemplate с Базовой аутентификацией потребует ручного вмешательства, поэтому вместо прямого объявления компонента для большей гибкости будет использоваться Spring FactoryBean . Эта фабрика создаст и настроит шаблон при инициализации:
@Component public class RestTemplateFactory implements FactoryBean, InitializingBean { private RestTemplate restTemplate; public RestTemplate getObject() { return restTemplate; } public Class getObjectType() { return RestTemplate.class; } public boolean isSingleton() { return true; } public void afterPropertiesSet() { HttpHost host = new HttpHost("localhost", 8082, "http"); restTemplate = new RestTemplate( new HttpComponentsClientHttpRequestFactoryBasicAuth(host)); } }
Значения host и port должны зависеть от среды, что позволяет клиенту гибко определять один набор значений для интеграционного тестирования и другой для производственного использования. Значениями можно управлять с помощью первой поддержки класса Spring для файлов свойств .
3. Ручное управление HTTP-заголовком авторизации
Процесс создания заголовка Authorization относительно прост для базовой аутентификации, поэтому его можно выполнить вручную с помощью нескольких строк кода:
HttpHeaders createHeaders(String username, String password){ return new HttpHeaders() {{ String auth = username + ":" + password; byte[] encodedAuth = Base64.encodeBase64( auth.getBytes(Charset.forName("US-ASCII")) ); String authHeader = "Basic " + new String( encodedAuth ); set( "Authorization", authHeader ); }}; }
Затем отправка запроса становится такой же простой:
restTemplate.exchange (uri, HttpMethod.POST, new HttpEntity(createHeaders(username, password)), clazz);
4. Автоматическое управление HTTP-заголовком авторизации
Как Spring 3.0, так и 3.1, а теперь и 4.x имеют очень хорошую поддержку HTTP-библиотек Apache:
- Spring 3.0, CommonsClientHttpRequestFactory интегрирован с now end-of-life/ HttpClient 3.x Spring 3.1 представила поддержку текущего
- HttpClient 4.x через HttpComponentsClientHttpRequestFactory (поддержка добавлена в JIRA SPR-6180 ) Spring 4.0 представила поддержку асинхронности через
- HttpComponentsAsyncClientHttpRequestFactory
Давайте начнем настройку с HttpClient 4 и Spring 4.
Для RestTemplate потребуется фабрика HTTP – запросов – фабрика, которая поддерживает базовую аутентификацию-пока все хорошо. Однако, используя существующий HttpComponentsClientHttpRequestFactory напрямую будет сложно, так как архитектура RestTemplate была разработана без хорошей поддержки для HttpContext – инструментальная часть головоломки. И поэтому нам нужно будет подкласс HttpComponentsClientHttpRequestFactory и переопределить метод createHttpContext :
public class HttpComponentsClientHttpRequestFactoryBasicAuth extends HttpComponentsClientHttpRequestFactory { HttpHost host; public HttpComponentsClientHttpRequestFactoryBasicAuth(HttpHost host) { super(); this.host = host; } protected HttpContext createHttpContext(HttpMethod httpMethod, URI uri) { return createHttpContext(); } private HttpContext createHttpContext() { AuthCache authCache = new BasicAuthCache(); BasicScheme basicAuth = new BasicScheme(); authCache.put(host, basicAuth); BasicHttpContext localcontext = new BasicHttpContext(); localcontext.setAttribute(HttpClientContext.AUTH_CACHE, authCache); return localcontext; } }
Именно здесь – при создании HttpContext – встроена базовая поддержка аутентификации. Как вы можете видеть, выполнение упреждающей базовой аутентификации с помощью HttpClient 4.x является немного обременительным : информация об аутентификации кэшируется, и процесс настройки этого кэша аутентификации очень ручной и неинтуитивный.
И с этим все на месте – RestTemplate теперь сможет поддерживать базовую схему аутентификации, просто добавив BasicAuthorizationInterceptor ;
restTemplate.getInterceptors().add( new BasicAuthorizationInterceptor("username", "password"));
И просьба:
restTemplate.exchange( "http://localhost:8082/spring-security-rest-basic-auth/api/foos/1", HttpMethod.GET, null, Foo.class);
Для подробного обсуждения того, как защитить саму службу REST, ознакомьтесь с этой статьей .
5. Зависимости Maven
Следующие зависимости Maven необходимы для самого RestTemplate и для библиотеки HttpClient:
org.springframework spring-webmvc 5.0.6.RELEASE org.apache.httpcomponents httpclient 4.5.3
При необходимости, если заголовок HTTP Authorization создается вручную, для поддержки кодирования требуется дополнительная библиотека:
commons-codec commons-codec 1.10
Вы найдете самые новые версии в репозитории Maven .
6. Заключение
Хотя ветвь разработки 3.x для Apache HttpClient уже давно подошла к концу, и поддержка Spring для этой версии полностью устарела, большая часть информации, которую можно найти в RestTemplate и безопасности, все еще не учитывает текущие выпуски HttpClient 4.x . Эта статья представляет собой попытку изменить это с помощью подробного пошагового обсуждения того, как настроить базовую аутентификацию с помощью RestTemplate и как использовать ее для использования защищенного API REST.
Чтобы выйти за рамки примеров кода в статье с реализацией как потребительской стороны, рассмотренной здесь, так и фактической службы RESTful, взгляните на проект на Github.
Это проект на основе Maven, поэтому его должно быть легко импортировать и запускать как есть.