Autenticazione di base con RestTemplate

Sommario

  • 1. Panoramica
  • 2. Impostazione del RestTemplate in primavera
  • 3. Gestione manuale dell'intestazione HTTP di autorizzazione
  • 4. Gestione automatica dell'intestazione HTTP di autorizzazione
  • 5. Dipendenze di Maven
  • 6. Conclusione

1. Panoramica

Questo articolo mostra come usare Springs RestTemplate per utilizzare un servizio RESTful protetto con l'autenticazione di base .

Una volta impostata l'autenticazione di base per il modello, ogni richiesta verrà inviata preventivamente contenente le credenziali complete necessarie per eseguire il processo di autenticazione. Le credenziali verranno codificate e utilizzeranno l' intestazione HTTP di autorizzazione , in conformità con le specifiche dello schema di autenticazione di base. Un esempio potrebbe essere questo:

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

2. Configurazione di RestTemplate

Il bootstrap di RestTemplate nel contesto Spring può essere fatto semplicemente dichiarando un bean per esso; tuttavia, l'impostazione di RestTemplate con l' autenticazione di base richiederà un intervento manuale, quindi invece di dichiarare direttamente il bean, verrà utilizzato uno Spring FactoryBean per una maggiore flessibilità. Questa fabbrica creerà e configurerà il modello durante l'inizializzazione:

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

I valori dell'host e della porta dovrebbero dipendere dall'ambiente, consentendo al cliente la flessibilità di definire un set di valori per il test di integrazione e un altro per l'uso in produzione. I valori possono essere gestiti dal supporto Spring di prima classe per i file delle proprietà.

3. Gestione manuale dell'intestazione HTTP di autorizzazione

Il processo di creazione dell'intestazione di autorizzazione è relativamente semplice per l'autenticazione di base, quindi può essere fatto praticamente manualmente con poche righe di codice:

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

Quindi, inviare una richiesta diventa altrettanto semplice:

restTemplate.exchange (uri, HttpMethod.POST, new HttpEntity(createHeaders(username, password)), clazz);

4. Gestione automatica dell'intestazione HTTP di autorizzazione

Sia Spring 3.0 che 3.1 e ora 4.x hanno un ottimo supporto per le librerie HTTP di Apache:

  • Spring 3.0, CommonsClientHttpRequestFactory integrato con HttpClient 3.x ormai fuori uso
  • La Spring 3.1 ha introdotto il supporto per l'attuale HttpClient 4.x tramite HttpComponentsClientHttpRequestFactory (supporto aggiunto in JIRA SPR-6180)
  • Spring 4.0 ha introdotto il supporto asincrono tramite HttpComponentsAsyncClientHttpRequestFactory

Iniziamo a configurare le cose con HttpClient 4 e Spring 4.

Il RestTemplate richiederà una factory di richieste HTTP, una factory che supporta l'autenticazione di base, finora tutto bene. Tuttavia, l' utilizzo diretto dell'esistente HttpComponentsClientHttpRequestFactory si rivelerà difficile, poiché l'architettura di RestTemplate è stata progettata senza un buon supporto per HttpContext , un pezzo strumentale del puzzle. Quindi dovremo creare una sottoclasse HttpComponentsClientHttpRequestFactory e sovrascrivere il metodo 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; } }

È qui, nella creazione di HttpContext , che è integrato il supporto dell'autenticazione di base. Come puoi vedere, eseguire l'autenticazione di base preventiva con HttpClient 4.x è un po 'un fardello: le informazioni di autenticazione vengono l'impostazione di questa cache di autenticazione è molto manuale e non intuitiva.

E con questo, tutto è a posto: il RestTemplate sarà ora in grado di supportare lo schema di autenticazione di base semplicemente aggiungendo un BasicAuthorizationInterceptor ;

restTemplate.getInterceptors().add( new BasicAuthorizationInterceptor("username", "password"));

E la richiesta:

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

Per una discussione approfondita su come proteggere il servizio REST stesso, consulta questo articolo.

5. Dipendenze di Maven

Le seguenti dipendenze Maven sono necessarie per RestTemplate stesso e per la libreria HttpClient:

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

Facoltativamente, se l' intestazione di autorizzazione HTTP viene costruita manualmente, è necessaria una libreria aggiuntiva per il supporto della codifica:

 commons-codec commons-codec 1.10 

Troverai le versioni più recenti nel repository Maven.

6. Conclusione

Sebbene il ramo di sviluppo 3.x per Apache HttpClient sia giunto al termine da un po 'di tempo e il supporto Spring per quella versione sia stato completamente deprecato, molte delle informazioni che possono essere trovate su RestTemplate e sulla sicurezza ancora non lo fanno tenere conto delle attuali versioni di HttpClient 4.x. Questo articolo è un tentativo di cambiarlo attraverso una discussione dettagliata e dettagliata su come impostare l'autenticazione di base con RestTemplate e su come usarlo per utilizzare un'API REST protetta.

Per andare oltre gli esempi di codice nell'articolo con l'implementazione sia del lato consuming, esaminato qui, ma anche dell'attuale RESTful Service, dai un'occhiata al progetto su Github.

Questo è un progetto basato su Maven, quindi dovrebbe essere facile da importare ed eseguire così com'è.