Základné overenie pomocou RestTemplate

Obsah

  • 1. Prehľad
  • 2. Nastavovanie RestTemplate na jar
  • 3. Ručná správa hlavičky HTTP autorizácie
  • 4. Automatická správa hlavičky HTTP autorizácie
  • 5. Maven závislosti
  • 6. Záver

1. Prehľad

Tento článok ukazuje, ako používať Springs RestTemplate do konzumovať RESTful službu zabezpečenú základným overením.

Po nastavení základného overenia šablóny sa odošle každá žiadosť preventívne obsahujúce úplné poverenia procesu autentifikácie. Prihlasovacie údaje budú zakódované a budú použité Povolenie Hlavička HTTP, v súlade so špecifikáciami schémy základného overenia. Príklad by vyzeral takto:

Autorizácia: Základné QWxhZGRpbjpvcGVuIHNlc2FtZQ ==

2. Nastavenie RestTemplate

Bootstrapovanie RestTemplate do jarného kontextu sa dá urobiť jednoduchým vyhlásením fazule; avšak zriadenie RestTemplate s Základné overenie bude vyžadovať manuálny zásah, takže namiesto priameho vyhlásenia fazule ešte jar FactoryBean budú použité pre väčšiu flexibilitu. Táto továreň vytvorí a nakonfiguruje šablónu pri inicializácii:

@ Komponenta verejná trieda RestTemplateFactory implementuje 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 = nový HttpHost ("localhost", 8082, "http"); restTemplate = nový RestTemplate (nový HttpComponentsClientHttpRequestFactoryBasicAuth (hostiteľ)); }}

The hostiteľ a prístav hodnoty by mali závisieť od prostredia - čo umožňuje klientovi flexibilitu pri definovaní jednej sady hodnôt pre testovanie integrácie a druhej pre produkčné použitie. Hodnoty je možné spravovať pomocou prvotriednej podpory Spring pre súbory vlastností.

3. Ručná správa hlavičky HTTP autorizácie

Proces vytvárania Povolenie hlavička je pre Basic Authentication pomerne jednoduchá, takže ju možno do značnej miery vykonať ručne pomocou niekoľkých riadkov kódu:

HttpHeaders createHeaders (meno používateľa reťazca, heslo reťazca) {vrátiť nové HttpHeaders () {{reťazec auth = používateľské meno + ":" + heslo; byte [] encodedAuth = Base64.encodeBase64 (auth.getBytes (Charset.forName ("US-ASCII"))); Reťazec authHeader = "Základné" + nový reťazec (encodedAuth); set ("Autorizácia", authHeader); }}; }

Potom bude odoslanie žiadosti rovnako jednoduché:

restTemplate.exchange (uri, HttpMethod.POST, nový HttpEntity (createHeaders (meno používateľa, heslo)), clazz);

4. Automatická správa hlavičky HTTP autorizácie

Spring 3.0 a 3.1 a teraz 4.x majú veľmi dobrú podporu pre knižnice Apache HTTP:

  • Jar 3.0 CommonsClientHttpRequestFactory integrovaný s teraz koniec životnostiHttpClient 3.x
  • Jar 3.1 priniesla podporu pre prúd HttpClient 4.x cez HttpComponentsClientHttpRequestFactory (podpora pridaná do JIRA SPR-6180)
  • Jar 4.0 zaviedla asynchronnú podporu prostredníctvom HttpComponentsAsyncClientHttpRequestFactory

Začnime nastavovať veci pomocou HttpClient 4 a Spring 4.

The RestTemplate bude vyžadovať továreň na požiadavku HTTP - továreň, ktorá podporuje základné overenie - zatiaľ je to dobré. Avšak s využitím existujúcich HttpComponentsClientHttpRequestFactory priamo ukáže ako ťažké, pretože architektúra RestTemplate bol navrhnutý bez dobrej podpory pre HttpContext - inštrumentálny kúsok skladačky. A preto budeme musieť podtriedu HttpComponentsClientHttpRequestFactory a prepísať createHttpContext metóda:

verejná trieda HttpComponentsClientHttpRequestFactoryBasicAuth rozširuje HttpComponentsClientHttpRequestFactory {hostiteľa HttpHost; public HttpComponentsClientHttpRequestFactoryBasicAuth (hostiteľ HttpHost) {super (); this.host = hostiteľ; } chránený HttpContext createHttpContext (HttpMethod httpMethod, URI uri) {návrat createHttpContext (); } súkromné ​​HttpContext createHttpContext () {AuthCache authCache = nový BasicAuthCache (); BasicScheme basicAuth = nový BasicScheme (); authCache.put (hostiteľ, basicAuth); BasicHttpContext localcontext = nový BasicHttpContext (); localcontext.setAttribute (HttpClientContext.AUTH_CACHE, authCache); vrátiť miestny kontext; }}

Je to tu - pri vytváraní HttpContext - že je zabudovaná základná podpora overovania. Ako vidíte, vykonávanie preventívneho základného overovania pomocou HttpClient 4.x je trochu záťažou: informácie o overení sa ukladajú do medzipamäte a proces nastavenia tejto overovacej medzipamäte je veľmi manuálny a neintuitívny .

A s tým je všetko na svojom mieste - RestTemplate bude teraz môcť podporiť schému základného overenia pridaním a BasicAuthorizationInterceptor;

restTemplate.getInterceptors (). add (new BasicAuthorizationInterceptor ("používateľské meno", "heslo"));

A požiadavka:

restTemplate.exchange ("// localhost: 8082 / spring-security-rest-basic-auth / api / foos / 1", HttpMethod.GET, null, Foo.class);

Podrobnú diskusiu o tom, ako zabezpečiť samotnú službu REST, nájdete v tomto článku.

5. Maven závislosti

Nasledujúce Maven závislosti sú požadované pre RestTemplate pre knižnicu HttpClient:

 org.springframework spring-webmvc 5.0.6.RELEASE org.apache.httpkomponenty httpclient 4.5.3 

Voliteľne, ak je HTTP Povolenie hlavička je zostavená ručne, potom je pre podporu kódovania potrebná ďalšia knižnica:

 commons-codec commons-codec 1.10 

Najnovšie verzie nájdete v úložisku Maven.

6. Záver

Aj keď vývojová vetva 3.x pre Apache HttpClient už nejaký čas skončila na konci života a jarná podpora tejto verzie bola úplne zastaraná, veľa informácií, ktoré nájdete na RestTemplate a bezpečnosť stále nezohľadňuje aktuálny HttpClient 4.x správy. Tento článok je pokusom zmeniť to pomocou podrobnej diskusie krok za krokom o tom, ako nastaviť základné overenie pomocou RestTemplate a ako ho používať na konzumáciu zabezpečeného rozhrania REST API.

Ak chcete ísť nad rámec ukážok kódu v článku s implementáciou jednak náročnej stránky, ktorá je tu preskúmaná, jednak skutočnej služby RESTful Service, pozrite si projekt na Github.

Toto je projekt založený na Maven, takže by malo byť ľahké ho importovať a spustiť tak, ako je.


$config[zx-auto] not found$config[zx-overlay] not found