Basisauthentifizierung mit dem RestTemplate

Grundlegende Authentifizierung mit dem RestTemplate

1. Überblick

Dieser Artikel zeigt, wie FedernRestTemplate bisconsume a RESTful Service secured with Basic Authentication verwendet werden.

Sobald die Standardauthentifizierung für die Vorlage eingerichtet ist, wird jeder Anforderungpreemptively containing the full credentials gesendet, die zur Durchführung des Authentifizierungsprozesses erforderlich sind. Die Anmeldeinformationen werden verschlüsselt und verwenden den HTTP-Header vonAuthorizationgemäß den Spezifikationen des Basisauthentifizierungsschemas. Ein Beispiel würde so aussehen:

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

Weitere Lektüre:

Fehlerbehandlung für Spring RestTemplate

Erfahren Sie, wie Sie mit Spring's RestTemplate mit Fehlern umgehen

Read more

Verwenden des Spring RestTemplate Interceptor

Erfahren Sie mehr über die Verwendung von Interceptors in Ihrer Spring-Anwendung mit der RestTemplate.

Read more

Entdecken Sie die Spring Boot TestRestTemplate

Erfahren Sie, wie Sie mit dem neuen TestRestTemplate in Spring Boot eine einfache API testen.

Read more

2. RestTemplate einrichten

Das Bootstrapping derRestTemplate in den Spring-Kontext kann durch einfaches Deklarieren einer Bean dafür erfolgen. Das Einrichten vonRestTemplate mitBasic Authentication erfordert jedoch einen manuellen Eingriff. Anstatt die Bean direkt zu deklarieren, wird für mehr Flexibilität ein SpringFactoryBean verwendet. 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 Wertehost undport sollten von der Umgebung abhängen. Dies ermöglicht dem Kunden die Flexibilität, einen Wertesatz für Integrationstests und einen anderen für die Verwendung in der Produktion zu definieren. Die Werte können mitfirst class Spring support for properties files verwaltet werden.

3. Manuelle Verwaltung des Autorisierungs-HTTP-Headers

Das Erstellen desAuthorization-Headers ist für die Basisauthentifizierung 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 );
      }};
}

Dann wird das Senden einer Anfrage genauso einfach:

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

4. Automatische Verwaltung des Autorisierungs-HTTP-Headers

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

  • Feder 3.0, dieCommonsClientHttpRequestFactory integriert in die jetztend-of-life’dHttpClient 3.x

  • In Frühjahr 3.1 wurde die Unterstützung für die aktuellenHttpClient 4.x überHttpComponentsClientHttpRequestFactory eingeführt (Unterstützung in den JIRASPR-6180 hinzugefügt).

  • In Spring 4.0 wurde die asynchrone Unterstützung überHttpComponentsAsyncClientHttpRequestFactory eingeführt

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

FürRestTemplate ist eine HTTP-Anforderungsfactory erforderlich - eine Factory, die die Standardauthentifizierung unterstützt - so weit, so gut. Die direkte Verwendung der vorhandenenHttpComponentsClientHttpRequestFactory wird sich jedoch als schwierig erweisen, da die Architektur vonRestTemplatewithout good support fürHttpContext entworfen wurde - ein instrumentelles Puzzleteil. Daher müssen wirHttpComponentsClientHttpRequestFactory unterordnen und die MethodecreateHttpContext überschreiben:

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 derHttpContext - ist die grundlegende Authentifizierungsunterstützung integriert. Wie Sie sehen können, beträgt die präemptive Basisauthentifizierung mit HttpClient 4.xa bit of a burden: Die Authentifizierungsinformationen werden zwischengespeichert, und das Einrichten dieses Authentifizierungscaches ist sehr manuell und nicht intuitiv.

Damit ist alles vorhanden - dieRestTemplate können jetzt das Standardauthentifizierungsschema unterstützen, indem sie nurBasicAuthorizationInterceptor hinzufügen.

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

Und die Bitte:

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

check out this article enthält eine ausführliche Beschreibung zur Sicherung des REST-Service.

5. Maven-Abhängigkeiten

Die folgenden Maven-Abhängigkeiten sind für dieRestTemplate 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 Header von HTTPAuthorizationmanuell erstellt wird, ist optional eine zusätzliche Bibliothek für die Codierungsunterstützung erforderlich:


   commons-codec
   commons-codec
   1.10

Die neuesten Versionen finden Sie inMaven 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 zuRestTemplate und Sicherheit zu finden the current HttpClient 4.x Releases werden immer noch nicht berücksichtigt. Dieser Artikel ist ein Versuch, dies durch eine ausführliche, schrittweise Diskussion darüber zu ändern, wie die Basisauthentifizierung mitRestTemplate eingerichtet und eine gesicherte REST-API verwendet wird.

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

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