Osnovna provjera autentičnosti pomoću RestTemplate

Sadržaj

  • 1. Pregled
  • 2. Postavljanje RestTemplate u proljeće
  • 3. Ručno upravljanje zaglavljem Autorizacija HTTP
  • 4. Automatsko upravljanje zaglavljem Autorizacija HTTP
  • 5. Mavenove ovisnosti
  • 6. Zaključak

1. Pregled

Ovaj članak pokazuje kako se koriste opruge RestTemplate do konzumirajte RESTful uslugu osiguranu osnovnom autentifikacijom.

Jednom kada je postavljena osnovna provjera autentičnosti za predložak, svaki će se zahtjev poslati s preventivnim sadržajem punih vjerodajnica potrebno za izvođenje postupka provjere autentičnosti. Vjerodajnice će biti kodirane i upotrebljavat će Ovlaštenje HTTP zaglavlje, u skladu sa specifikacijama osnovne sheme provjere autentičnosti. Primjer bi izgledao ovako:

Odobrenje: Osnovni QWxhZGRpbjpvcGVuIHNlc2FtZQ ==

2. Postavljanje RestTemplate

Podizanje sustava RestTemplate u kontekst Proljeća može se učiniti jednostavnim deklariranjem graha; međutim, postavljanje RestTemplate s Osnovna autentifikacija zahtijevat će ručnu intervenciju, pa umjesto da grah izravno proglasite Proljećem FactoryBean koristit će se za veću fleksibilnost. Ova tvornica će stvoriti i konfigurirati predložak prilikom inicijalizacije:

@Component javna klasa RestTemplateFactory implementira FactoryBean, InitializingBean {private RestTemplate restTemplate; javni RestTemplate getObject () {return restTemplate; } javna klasa getObjectType () {return RestTemplate.class; } javni boolean isSingleton () {return true; } javna void afterPropertiesSet () {HttpHost host = novi HttpHost ("localhost", 8082, "http"); restTemplate = novi RestTemplate (novi HttpComponentsClientHttpRequestFactoryBasicAuth (host)); }}

The domaćin i luka vrijednosti bi trebale ovisiti o okolini - omogućujući klijentu fleksibilnost da definira jedan skup vrijednosti za integracijsko testiranje, a drugi za proizvodnu upotrebu. Vrijednostima može upravljati prva klasa Spring support za datoteke svojstava.

3. Ručno upravljanje HTTP zaglavljem autorizacije

Proces stvaranja Ovlaštenje header relativno je jednostavan za osnovnu provjeru autentičnosti, pa se to prilično može učiniti ručno s nekoliko redaka koda:

HttpHeaders createHeaders (korisničko ime niza, lozinka niza) {return new HttpHeaders () {{String auth = username + ":" + lozinka; bajt [] encodedAuth = Base64.encodeBase64 (auth.getBytes (Charset.forName ("US-ASCII"))); String authHeader = "Basic" + novi String (encodedAuth); set ("Autorizacija", authHeader); }}; }

Tada slanje zahtjeva postaje jednako jednostavno:

restTemplate.exchange (uri, HttpMethod.POST, novi HttpEntity (createHeaders (korisničko ime, lozinka)), clazz);

4. Automatsko upravljanje HTTP zaglavljem autorizacije

I Spring 3.0 i 3.1 i sada 4.x imaju vrlo dobru podršku za Apache HTTP knjižnice:

  • Proljeće 3.0, CommonsClientHttpRequestFactory integrirano sa sadašnjim kraj životaHttpClient 3.x
  • Proljeće 3.1 uveo je podršku za struju HttpClient 4.x preko HttpComponentsClientHttpRequestFactory (podrška dodana u JIRA SPR-6180)
  • Proljeće 4.0 je uvelo async podršku putem HttpComponentsAsyncClientHttpRequestFactory

Počnimo postavljati stvari s HttpClient 4 i Spring 4.

The RestTemplate trebat će tvornica HTTP zahtjeva - tvornica koja podržava osnovnu provjeru autentičnosti - zasad je dobra. Međutim, koristeći postojeće HttpComponentsClientHttpRequestFactory izravno će se pokazati teškim, jer je arhitektura RestTemplate je dizajniran bez dobre podrške za HttpContext - instrumentalni dio slagalice. I zato ćemo morati podrazred HttpComponentsClientHttpRequestFactory i poništiti createHttpContext metoda:

javna klasa HttpComponentsClientHttpRequestFactoryBasicAuth proširuje HttpComponentsClientHttpRequestFactory {HttpHost host; javni HttpComponentsClientHttpRequestFactoryBasicAuth (HttpHost host) {super (); this.host = host; } zaštićeni HttpContext createHttpContext (HttpMethod httpMethod, URI uri) {return createHttpContext (); } privatni HttpContext createHttpContext () {AuthCache authCache = novi BasicAuthCache (); BasicScheme basicAuth = novi BasicScheme (); authCache.put (host, basicAuth); BasicHttpContext localcontext = novi BasicHttpContext (); localcontext.setAttribute (HttpClientContext.AUTH_CACHE, authCache); povratak localcontext; }}

Ovdje je - u stvaranju HttpContext - da je ugrađena osnovna podrška za provjeru autentičnosti. Kao što vidite, izvođenje preventivne osnovne provjere autentičnosti s HttpClient 4.x-om predstavlja malo opterećenje: informacije o provjeri autentičnosti su predmemorirane, a postupak postavljanja ove predmemorije provjere autentičnosti vrlo je ručan i neintuitivan .

A s tim je sve na svom mjestu - RestTemplate sada će moći podržati osnovnu shemu provjere autentičnosti samo dodavanjem BasicAuthorizationInterceptor;

restTemplate.getInterceptors (). add (novi BasicAuthorizationInterceptor ("korisničko ime", "lozinka"));

I zahtjev:

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

Detaljnu raspravu o tome kako osigurati samu REST uslugu potražite u ovom članku.

5. Ovisnosti Mavena

Sljedeće Mavenove ovisnosti potrebne su za RestTemplate i za knjižnicu HttpClient:

 org.springframework spring-webmvc 5.0.6.OSPUSTI org.apache.httpcomponents httpclient 4.5.3 

Po želji, ako HTTP Ovlaštenje zaglavlje se konstruira ručno, tada je potrebna dodatna knjižnica za podršku kodiranju:

 commons-codec commons-codec 1.10 

Najnovije verzije pronaći ćete u spremištu Maven.

6. Zaključak

Iako je 3.x grana razvoja za Apache HttpClient već neko vrijeme završila životni vijek, a proljetna podrška za tu verziju potpuno je zastarjela, mnogi podaci koji se mogu naći na RestTemplate a sigurnost još uvijek ne uzima u obzir trenutni HttpClient 4.x izdanja. Ovaj je članak pokušaj da se to promijeni kroz detaljnu, detaljnu raspravu o tome kako postaviti osnovnu provjeru identiteta pomoću RestTemplate i kako ga koristiti za konzumiranje osiguranog REST API-ja.

Da biste prošli dalje od uzoraka koda u članku s implementacijom obje strane koja konzumira ovdje, ali i stvarne RESTful usluge, pogledajte projekt na Githubu.

Ovo je projekt zasnovan na Mavenu, pa bi ga trebalo lako uvesti i pokrenuti kakav jest.