Grundlegende Authentifizierung mit dem RestTemplate

Inhaltsverzeichnis

  • 1. Übersicht
  • 2. Einrichten der RestTemplate im Frühjahr
  • 3. Manuelle Verwaltung des HTTP-Headers für die Autorisierung
  • 4. Automatische Verwaltung des HTTP-Headers für die Autorisierung
  • 5. Maven-Abhängigkeiten
  • 6. Fazit

1. Übersicht

Dieser Artikel zeigt , wie Federn verwenden RestTemplate um einen RESTful - Service mit Standardauthentifizierung gesichert zu verbrauchen .

Sobald die Standardauthentifizierung für die Vorlage eingerichtet ist, wird jede Anforderung präventiv mit den vollständigen Anmeldeinformationen gesendet , die zur Durchführung des Authentifizierungsprozesses erforderlich sind. Die Anmeldeinformationen werden verschlüsselt und verwenden den HTTP-Header für die Autorisierung gemäß den Spezifikationen des Standardauthentifizierungsschemas. Ein Beispiel würde so aussehen:

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

2. Einrichten der RestTemplate

Das Bootstrapping der RestTemplate in den Spring-Kontext kann durch einfaches Deklarieren einer Bean dafür erfolgen. jedoch die Einrichtung RestTemplate mit Standardauthentifizierung erfordert einen manuellen Eingriff, so dass anstelle der Bohne direkt zu erklären, ein Frühlings - FactoryBean wird für mehr Flexibilität verwendet werden. Diese Factory erstellt und konfiguriert die Vorlage bei der Initialisierung:

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

Die Host und Port - Werte sollten von der Umgebung abhängig sein - so dass der Client die Flexibilität , einen Satz von Werten für Integrationstests und eine andere für den Produktionseinsatz zu definieren. Die Werte können von der erstklassigen Spring-Unterstützung für Eigenschaftendateien verwaltet werden.

3. Manuelle Verwaltung des Autorisierungs-HTTP-Headers

Das Erstellen des Autorisierungsheaders ist für die Standardauthentifizierung relativ einfach, sodass es mit einigen Codezeilen praktisch manuell durchgeführt werden kann:

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

Das Senden einer Anfrage wird dann genauso einfach:

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

4. Automatische Verwaltung des HTTP-Headers für die Autorisierung

Sowohl Spring 3.0 als auch 3.1 und jetzt 4.x unterstützen die Apache-HTTP-Bibliotheken sehr gut:

  • Im Frühjahr 3.0 wurde die CommonsClientHttpRequestFactory in den jetzt am Ende der Lebensdauer befindlichen HttpClient 3.x integriert
  • In Spring 3.1 wurde die Unterstützung für den aktuellen HttpClient 4.x über HttpComponentsClientHttpRequestFactory eingeführt (Unterstützung im JIRA SPR-6180 hinzugefügt).
  • In Spring 4.0 wurde die asynchrone Unterstützung über die HttpComponentsAsyncClientHttpRequestFactory eingeführt

Beginnen wir mit der Einrichtung von HttpClient 4 und Spring 4.

Für das RestTemplate ist eine HTTP-Anforderungsfactory erforderlich - eine Factory, die die Standardauthentifizierung unterstützt - soweit, so gut. Die direkte Verwendung der vorhandenen HttpComponentsClientHttpRequestFactory wird sich jedoch als schwierig erweisen, da die Architektur von RestTemplate ohne gute Unterstützung für HttpContext entwickelt wurde - ein wesentliches Teil des Puzzles. Und so müssen wir zu Unterklasse HttpComponentsClientHttpRequestFactory und das außer Kraft setzen createHttpContext Methode:

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

Hier - bei der Erstellung des HttpContext - ist die grundlegende Authentifizierungsunterstützung integriert. Wie Sie sehen, ist die präventive Basisauthentifizierung mit HttpClient 4.x eine gewisse Belastung: Die Authentifizierungsinformationen werden zwischengespeichert und der Prozess von Das Einrichten dieses Authentifizierungscaches ist sehr manuell und nicht intuitiv.

Damit ist alles vorhanden - das RestTemplate kann jetzt das Standardauthentifizierungsschema unterstützen, indem nur ein BasicAuthorizationInterceptor hinzugefügt wird .

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

Und die Anfrage:

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

In diesem Artikel finden Sie ausführliche Informationen zum Sichern des REST-Service.

5. Maven-Abhängigkeiten

Die folgenden Maven-Abhängigkeiten sind für das RestTemplate selbst und für die HttpClient-Bibliothek erforderlich :

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

Wenn der HTTP- Autorisierungsheader manuell erstellt wird, ist optional eine zusätzliche Bibliothek für die Codierungsunterstützung erforderlich:

 commons-codec commons-codec 1.10 

Sie finden die neuesten Versionen im Maven-Repository.

6. Fazit

Obwohl der 3.x-Entwicklungszweig für Apache HttpClient bereits seit einiger Zeit das Ende seiner Lebensdauer erreicht hat und die Spring-Unterstützung für diese Version vollständig veraltet ist, sind viele Informationen, die in RestTemplate und in der Sicherheit enthalten sind, immer noch nicht verfügbar Konto für die aktuellen HttpClient 4.x- Versionen. Dieser Artikel ist ein Versuch, dies durch eine ausführliche, schrittweise Erörterung zu ändern, wie die Standardauthentifizierung mit der RestTemplate eingerichtet und eine gesicherte REST-API verwendet wird.

Um über die Codebeispiele im Artikel mit der Implementierung sowohl der hier untersuchten konsumierenden Seite als auch des tatsächlichen RESTful Service hinauszugehen, werfen Sie einen Blick auf das Projekt auf Github.

Dies ist ein Maven-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein.