Основно удостоверяване с RestTemplate

Съдържание

  • 1. Общ преглед
  • 2. Настройка на RestTemplate през пролетта
  • 3. Ръчно управление на HTTP заглавката Authorization
  • 4. Автоматично управление на HTTP заглавката Authorization
  • 5. Зависимости на Maven
  • 6. Заключение

1. Общ преглед

Тази статия показва как да използвате Springs RestTemplate за консумиране на RESTful услуга, защитена с основно удостоверяване .

След като основното удостоверяване е настроено за шаблона, всяка заявка ще бъде изпратена предимно, съдържаща пълните идентификационни данни, необходими за извършване на процеса на удостоверяване. Идентификационните данни ще бъдат кодирани и ще използват HTTP Header за упълномощаване , в съответствие със спецификациите на основната схема за удостоверяване. Един пример би изглеждал така:

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

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)); } }

Стойностите на хоста и порта трябва да зависят от средата - позволявайки на клиента гъвкавостта да дефинира един набор от стойности за тестване на интеграция и друг за производствена употреба. Стойностите могат да се управляват от поддръжката на първия клас Spring за файлове със свойства.

3. Ръчно управление на HTTP заглавието за оторизация

Процесът на създаване на заглавката за упълномощаване е сравнително лесен за основно удостоверяване, така че може да се направи доста ръчно с няколко реда код:

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 имат много добра поддръжка за Apache HTTP библиотеките:

  • Пролет 3.0, CommonsClientHttpRequestFactory се интегрира с 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( "//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 вече известно време е достигнал края на живота и пролетната поддръжка за тази версия е напълно оттеглена, голяма част от информацията, която може да се намери в RestTemplate и сигурността, все още не отчитане на тока HttpClient 4.x издания. Тази статия е опит да се промени това чрез подробна, поетапна дискусия за това как да настроите основно удостоверяване с RestTemplate и как да го използвате за консумиране на защитен REST API.

За да преминете отвъд примерните кодове в статията с изпълнението както на консумиращата страна, разгледана тук, но и на действителната RESTful услуга, погледнете проекта в Github.

Това е проект, базиран на Maven, така че трябва да е лесно да се импортира и да се изпълнява както е.