目次

1. 概要

このチュートリアルでは、Springの RestTemplate を使用して、基本認証で保護されたRESTfulサービスを利用する方法を学習します。

テンプレートの基本認証を設定すると、認証プロセスの実行に必要な完全な資格情報を含む各リクエストがプリエンプティブに送信されます。 クレデンシャルはエンコードされ、基本認証スキームの仕様に従って AuthorizationHTTPヘッダーを使用します。 例は次のようになります。

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

2. RestTemplateの設定

beanを宣言するだけで、RestTemplateをSpringコンテキストにブートストラップできます。 ただし、 RestTemplate 基本認証で設定するには手動による介入が必要になるため、beanを直接宣言する代わりに、SpringファクトリBeanを使用します。 ]より柔軟性があります。 このFactoryBeanは、初期化時にテンプレートを作成および構成します。

@Component
public class RestTemplateFactory
  implements FactoryBean<RestTemplate>, InitializingBean {
 
    private RestTemplate restTemplate;

    public RestTemplate getObject() {
        return restTemplate;
    }
    public Class<RestTemplate> 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));
    }
}

hostおよびportの値は環境に依存する必要があります。これにより、クライアントは、統合テスト用と本番用の値のセットを柔軟に定義できます。 値は、プロパティファイルのファーストクラスSpringサポートによって管理できます。

3. 承認HTTPヘッダーの手動管理

基本認証用のAuthorizationヘッダーを作成するのはかなり簡単なので、数行のコードで手動で作成できます。

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

さらに、リクエストの送信も同様に簡単です。

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

4. 承認HTTPヘッダーの自動管理

Spring 3.0および3.1、そして現在は4.xは、ApacheHTTPライブラリを非常によくサポートしています。

  • Spring 3.0では、CommonsClientHttpRequestFactoryが現在のend-of-life’d HttpClient3.x.と統合されています。
  • Spring 3.1では、HttpComponentsClientHttpRequestFactoryを介して現在のHttpClient4.x のサポートが導入されました(JIRA SPR-6180 でサポートが追加されました)。
  • Spring 4.0では、HttpComponentsAsyncClientHttpRequestFactoryを介して非同期サポートが導入されました。

HttpClient4とSpring4を使用してセットアップを開始しましょう。

RestTemplate には、基本認証をサポートするHTTPリクエストファクトリが必要です。 ただし、 RestTemplate のアーキテクチャは、 HttpContext、の適切なサポートなしで設計されているため、既存のHttpComponentsClientHttpRequestFactoryを直接使用することは困難です。パズルのインストルメンタルピース。 そのため、 HttpComponentsClientHttpRequestFactory をサブクラス化し、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;
    }
}

ここでは、 HttpContext の作成で、基本認証サポートを構築しました。 ご覧のとおり、HttpClient4.xでプリエンプティブな基本認証を行うのは少し負担です。 認証情報はキャッシュされており、この認証キャッシュを設定するのは非常に手動で直感的ではありません。

すべてが整ったので、 RestTemplate は、 BasicAuthorizationInterceptor:を追加するだけで基本認証スキームをサポートできるようになります。

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

次に、リクエスト:

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

RESTサービス自体を保護する方法の詳細については、この記事を確認してください。

5. Mavenの依存関係

RestTemplate 自体とHttpClientライブラリには、次のMaven依存関係が必要です。

<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-webmvc</artifactId>
   <version>5.0.6.RELEASE</version>
</dependency>

<dependency>
   <groupId>org.apache.httpcomponents</groupId>
   <artifactId>httpclient</artifactId>
   <version>4.5.3</version>
</dependency>

オプションで、HTTP Authorization ヘッダーを手動で作成する場合は、エンコードをサポートするための追加のライブラリが必要になります。

<dependency>
   <groupId>commons-codec</groupId>
   <artifactId>commons-codec</artifactId>
   <version>1.10</version>
</dependency>

最新バージョンはMavenリポジトリにあります。

6. 結論

RestTemplate とセキュリティに記載されている情報の多くは、3.xブランチが終了し、Springのそのバージョンのサポートは完全に非推奨です。 この記事では、 RestTemplate を使用して基本認証を設定し、それを使用してセキュリティで保護されたREST APIを使用する方法について、詳細なステップバイステップの説明を行うことで、これを変更しようとしています。

この記事のコードサンプルを超えて、消費側と実際のRESTfulサービスを実装するには、Githubのプロジェクトをご覧ください。

これはMavenベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。