Pengesahan Asas dengan RestTemplate

Isi kandungan

  • 1. Gambaran keseluruhan
  • 2. Menyiapkan RestTemplate pada Musim Bunga
  • 3. Pengurusan manual tajuk HTTP Kebenaran
  • 4. Pengurusan automatik tajuk HTTP Pengesahan
  • 5. Ketergantungan Maven
  • 6. Kesimpulannya

1. Gambaran keseluruhan

Artikel ini menunjukkan cara menggunakan Springs RestTemplate untuk menggunakan Perkhidmatan RESTful yang dijamin dengan Pengesahan Asas .

Setelah Pengesahan Asas disiapkan untuk templat, setiap permintaan akan dihantar terlebih dahulu yang mengandungi kelayakan penuh yang diperlukan untuk melakukan proses pengesahan. Kredensial akan dikodkan dan akan menggunakan Header HTTP Pengesahan , sesuai dengan spesifikasi skema Pengesahan Asas. Contohnya akan kelihatan seperti ini:

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

2. Menyiapkan RestTemplate

Bootstrap the RestTemplate ke dalam konteks Spring dapat dilakukan dengan hanya menyatakan kacang untuk itu; namun, menyiapkan RestTemplate dengan Pengesahan Asas akan memerlukan campur tangan manual, jadi daripada menyatakan kacang secara langsung, Spring FactoryBean akan digunakan untuk lebih banyak fleksibilitas. Kilang ini akan membuat dan mengkonfigurasi templat pada permulaan:

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

Nilai hos dan port harus bergantung pada persekitaran - membolehkan pelanggan fleksibiliti untuk menentukan satu set nilai untuk pengujian integrasi dan satu lagi untuk penggunaan pengeluaran. Nilai dapat dikendalikan oleh sokongan Spring kelas pertama untuk fail sifat.

3. Pengurusan Manual Header HTTP Kebenaran

Proses membuat tajuk Pengesahan agak mudah untuk Pengesahan Asas, jadi ia dapat dilakukan secara manual dengan beberapa baris kod:

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

Kemudian, menghantar permintaan menjadi sama mudah:

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

4. Pengurusan Automatik Pengetua HTTP Pengesahan

Kedua-dua Spring 3.0 dan 3.1 dan sekarang 4.x mempunyai sokongan yang sangat baik untuk perpustakaan HTTP Apache:

  • Spring 3.0, CommonsClientHttpRequestFactory yang disatukan dengan HttpClient 3.x yang kini berakhir dengan kehidupan
  • Spring 3.1 memperkenalkan sokongan untuk HttpClient 4.x semasa melalui HttpComponentsClientHttpRequestFactory (sokongan ditambah dalam JIRA SPR-6180)
  • Spring 4.0 memperkenalkan sokongan async melalui HttpComponentsAsyncClientHttpRequestFactory

Mari mulakan persediaan dengan HttpClient 4 dan Spring 4.

The RestTemplate akan memerlukan permintaan HTTP kilang - kilang yang menyokong Pengesahan Asas - setakat ini, begitu baik. Walau bagaimanapun, menggunakan HttpComponentsClientHttpRequestFactory yang ada secara langsung akan menjadi sukar, kerana seni bina RestTemplate direka tanpa sokongan yang baik untuk HttpContext - bahagian teka-teki instrumental. Oleh itu, kita perlu menundukkan HttpComponentsClientHttpRequestFactory dan mengatasi kaedah 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; } }

Di sinilah - dalam penciptaan HttpContext - sokongan pengesahan asas dibina. Seperti yang anda lihat, melakukan Pengesahan Asas preemptive dengan HttpClient 4.x sedikit membebankan: maklumat pengesahan disimpan dalam cache dan proses menyediakan cache pengesahan ini sangat manual dan tidak menarik.

Dan dengan itu, semuanya sudah siap - RestTemplate kini dapat menyokong skema Pengesahan Asas hanya dengan menambahkan BasicAuthorizationInterceptor ;

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

Dan permintaannya:

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

Untuk perbincangan mendalam mengenai cara mendapatkan Perkhidmatan REST itu sendiri, lihat artikel ini.

5. Pergantungan Maven

Pergantungan Maven berikut diperlukan untuk RestTemplate itu sendiri dan untuk perpustakaan HttpClient:

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

Secara pilihan, jika tajuk HTTP Authorization dibina secara manual, maka perpustakaan tambahan diperlukan untuk sokongan pengekodan:

 commons-codec commons-codec 1.10 

Anda akan menemui versi terbaru di repositori Maven.

6. Kesimpulannya

Walaupun cabang pengembangan 3.x untuk Apache HttpClient telah mencapai akhir hayat untuk sementara waktu sekarang, dan sokongan Spring untuk versi itu telah habis sepenuhnya, banyak maklumat yang terdapat di RestTemplate dan keselamatan masih tidak akaun untuk siaran HttpClient 4.x semasa . Artikel ini adalah percubaan untuk mengubahnya melalui perbincangan terperinci, langkah demi langkah mengenai cara mengatur Pengesahan Asas dengan RestTemplate dan cara menggunakannya untuk menggunakan REST API yang diamankan.

Untuk melampaui contoh kod dalam artikel dengan pelaksanaan kedua-dua sisi yang memakan, yang diperiksa di sini, tetapi juga RESTful Service yang sebenarnya, lihatlah projek di Github.

Ini adalah projek berasaskan Maven, jadi mudah diimport dan dijalankan sebagaimana adanya.