Рубрики
Без рубрики

Базовая аутентификация с помощью RestTemplate

Как выполнить базовую аутентификацию с помощью Spring RestTemplate.

Автор оригинала: 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, поэтому его должно быть легко импортировать и запускать как есть.