Basisverificatie met de RestTemplate

Inhoudsopgave

  • 1. Overzicht
  • 2. Het instellen van het RestTemplate in de lente
  • 3. Handmatig beheer van de autorisatie HTTP-header
  • 4. Automatisch beheer van de autorisatie HTTP-header
  • 5. Maven-afhankelijkheden
  • 6. Conclusie

1. Overzicht

Dit artikel laat zien hoe je Springs gebruikt RestTemplate naar consumeer een RESTful-service die is beveiligd met basisverificatie.

Zodra de basisverificatie is ingesteld voor de sjabloon, wordt elk verzoek verzonden preventief met de volledige inloggegevens nodig om het authenticatieproces uit te voeren. De inloggegevens worden gecodeerd en gebruiken de Autorisatie HTTP-header, in overeenstemming met de specificaties van het basisverificatieschema. Een voorbeeld zou er als volgt uitzien:

Autorisatie: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ ==

2. Het instellen van het RestTemplate

Bootstrapping van het RestTemplate in de lentecontext kan worden gedaan door er simpelweg een boon voor te verklaren; het instellen van de RestTemplate met Basisverificatie vereist handmatige tussenkomst, dus in plaats van de boon direct een lente te noemen FactoryBean zal worden gebruikt voor meer flexibiliteit. Deze fabriek maakt en configureert de sjabloon bij initialisatie:

@Component openbare klasse RestTemplateFactory implementeert FactoryBean, InitializingBean {private RestTemplate restTemplate; openbare RestTemplate getObject () {return restTemplate; } openbare klasse getObjectType () {retourneer RestTemplate.class; } openbare boolean isSingleton () {retourneert waar; } public void afterPropertiesSet () {HttpHost host = nieuwe HttpHost ("localhost", 8082, "http"); restTemplate = nieuwe RestTemplate (nieuwe HttpComponentsClientHttpRequestFactoryBasicAuth (host)); }}

De gastheer en haven waarden moeten afhankelijk zijn van de omgeving - waardoor de klant de flexibiliteit krijgt om een ​​set waarden te definiëren voor integratietests en een andere voor productiegebruik. De waarden kunnen worden beheerd door de eerste klas Spring-ondersteuning voor eigenschappenbestanden.

3. Handmatig beheer van de autorisatie HTTP-header

Het proces van het maken van het Autorisatie header is relatief eenvoudig voor basisverificatie, dus het kan vrijwel handmatig worden gedaan met een paar regels code:

HttpHeaders createHeaders (String gebruikersnaam, String wachtwoord) {retourneer nieuwe HttpHeaders () {{String auth = gebruikersnaam + ":" + wachtwoord; byte [] encodedAuth = Base64.encodeBase64 (auth.getBytes (Charset.forName ("US-ASCII"))); String authHeader = "Basic" + nieuwe String (encodedAuth); set ("Autorisatie", authHeader); }}; }

Dan wordt het verzenden van een verzoek net zo eenvoudig:

restTemplate.exchange (uri, HttpMethod.POST, nieuwe HttpEntity (createHeaders (gebruikersnaam, wachtwoord)), clazz);

4. Automatisch beheer van de autorisatie HTTP-header

Zowel Spring 3.0 als 3.1 en nu 4.x hebben zeer goede ondersteuning voor de Apache HTTP-bibliotheken:

  • Spring 3.0, het CommonsClientHttpRequestFactory geïntegreerd met het nu end-of-life'dHttpClient 3.x
  • Spring 3.1 introduceerde ondersteuning voor de huidige HttpClient 4.x via HttpComponentsClientHttpRequestFactory (ondersteuning toegevoegd in de JIRA SPR-6180)
  • Spring 4.0 introduceerde async-ondersteuning via het HttpComponentsAsyncClientHttpRequestFactory

Laten we beginnen met het opzetten van dingen met HttpClient 4 en Spring 4.

De RestTemplate vereist een HTTP-verzoekfabriek - een fabriek die basisverificatie ondersteunt - tot nu toe, dus goed. Gebruik echter het bestaande HttpComponentsClientHttpRequestFactory direct zal moeilijk blijken te zijn, zoals de architectuur van RestTemplate is ontworpen zonder goede ondersteuning voor HttpContext - een instrumenteel stukje van de puzzel. En dus moeten we een subklasse maken HttpComponentsClientHttpRequestFactory en negeer de createHttpContext methode:

openbare klasse HttpComponentsClientHttpRequestFactoryBasicAuth breidt HttpComponentsClientHttpRequestFactory {HttpHost host; openbare HttpComponentsClientHttpRequestFactoryBasicAuth (HttpHost host) {super (); this.host = host; } beschermde HttpContext createHttpContext (HttpMethod httpMethod, URI uri) {return createHttpContext (); } private HttpContext createHttpContext () {AuthCache authCache = nieuwe BasicAuthCache (); BasicScheme basicAuth = nieuwe BasicScheme (); authCache.put (host, basicAuth); BasicHttpContext localcontext = nieuwe BasicHttpContext (); localcontext.setAttribute (HttpClientContext.AUTH_CACHE, authCache); return localcontext; }}

Het is hier - bij de oprichting van de HttpContext - dat de basisauthenticatie-ondersteuning is ingebouwd. Zoals u kunt zien, is preventieve basisauthenticatie met HttpClient 4.x een beetje een last: de authenticatiegegevens worden in de cache opgeslagen en het proces van het instellen van deze authenticatiecache is erg handmatig en niet intuïtief .

En daarmee is alles op zijn plaats - de RestTemplate kan nu het basisverificatieschema ondersteunen door een BasicAuthorizationInterceptor;

restTemplate.getInterceptors (). add (nieuwe BasicAuthorizationInterceptor ("gebruikersnaam", "wachtwoord"));

En het verzoek:

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

Lees dit artikel voor een diepgaande discussie over het beveiligen van de REST-service zelf.

5. Maven Afhankelijkheden

De volgende Maven-afhankelijkheden zijn vereist voor het RestTemplate zichzelf en voor de HttpClient-bibliotheek:

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

Optioneel, als de HTTP Autorisatie header handmatig wordt samengesteld, dan is een extra bibliotheek vereist voor de coderingsondersteuning:

 commons-codec commons-codec 1.10 

U vindt de nieuwste versies in de Maven-repository.

6. Conclusie

Hoewel de 3.x-tak van ontwikkeling voor Apache HttpClient al een tijdje het einde van zijn levensduur heeft bereikt en de Spring-ondersteuning voor die versie volledig is verouderd, is veel van de informatie die te vinden is op RestTemplate en beveiliging houdt nog steeds geen rekening mee de huidige HttpClient 4.x releases. Dit artikel is een poging om dat te veranderen door middel van een gedetailleerde, stapsgewijze bespreking van het instellen van basisverificatie met het RestTemplate en hoe je het kunt gebruiken om een ​​beveiligde REST API te gebruiken.

Om verder te gaan dan de codevoorbeelden in het artikel met de implementatie van zowel de consumerende kant, die hier wordt onderzocht, maar ook de daadwerkelijke RESTful Service, bekijk je het project op Github.

Dit is een op Maven gebaseerd project, dus het zou gemakkelijk moeten kunnen worden geïmporteerd en uitgevoerd zoals het is.