Pengantar Keamanan Cloud Musim Semi

1. Ikhtisar

Modul Spring Cloud Security menyediakan fitur yang terkait dengan keamanan berbasis token di aplikasi Spring Boot.

Secara khusus, ini membuat SSO berbasis OAuth2 lebih mudah - dengan dukungan untuk menyampaikan token antara Server Sumber Daya, serta mengonfigurasi otentikasi hilir menggunakan proxy Zuul yang disematkan.

Dalam artikel singkat ini, kita akan melihat bagaimana kita dapat mengkonfigurasi fitur-fitur ini menggunakan aplikasi klien Spring Boot, Server Otorisasi, dan REST API yang berfungsi sebagai Server Sumber Daya.

Perhatikan bahwa untuk contoh ini, kami hanya memiliki satu aplikasi Klien yang menggunakan SSO untuk mendemonstrasikan fitur keamanan cloud - tetapi dalam skenario umum, kami akan memiliki setidaknya dua aplikasi klien untuk memenuhi kebutuhan Single Sign-On.

2. Memulai Cepat Aplikasi Keamanan Cloud

Mari kita mulai dengan mengkonfigurasi SSO di aplikasi Spring Boot.

Pertama, kita perlu menambahkan dependensi spring-cloud-starter-oauth2 :

 org.springframework.cloud spring-cloud-starter-oauth2 2.2.2.RELEASE 

Ini juga akan membawa ketergantungan pegas-cloud-starter-keamanan .

Kami dapat mengonfigurasi situs sosial apa pun sebagai Server Auth untuk situs kami atau kami dapat menggunakan server kami sendiri. Dalam kasus kami, kami telah memilih opsi terakhir dan mengonfigurasi aplikasi yang bertindak sebagai Server Otorisasi - yang diterapkan secara lokal di // localhost: 7070 / authserver.

Server otorisasi kami menggunakan token JWT.

Selain itu, agar Klien mana pun dapat mengambil kredensial pengguna, kami perlu mengkonfigurasi Server Sumber Daya kami, yang berjalan pada port 9000, dengan titik akhir yang dapat melayani kredensial ini.

Di sini, kami telah mengonfigurasi titik akhir / pengguna yang tersedia di // localhost: 9000 / pengguna.

Untuk detail lebih lanjut tentang cara menyiapkan Server Otorisasi dan Server Sumber Daya, lihat artikel kami sebelumnya di sini.

Kami sekarang dapat menambahkan anotasi di kelas konfigurasi di aplikasi Klien kami:

@Configuration @EnableOAuth2Sso public class SiteSecurityConfigurer extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { // ... } }

Setiap permintaan yang memerlukan otentikasi akan diarahkan ke Server Otorisasi. Agar ini berfungsi, kami juga harus menentukan properti server:

security: oauth2: client: accessTokenUri: //localhost:7070/authserver/oauth/token userAuthorizationUri: //localhost:7070/authserver/oauth/authorize clientId: authserver clientSecret: passwordforauthserver resource: userInfoUri: //localhost:9000/user

Perhatikan bahwa kita perlu memiliki spring-boot-starter-security di classpath kita untuk menemukan konfigurasi di atas berfungsi.

3. Menyampaikan Token Akses

Saat menyampaikan token, Klien OAuth2 meneruskan token OAuth2 yang diterima olehnya ke permintaan sumber daya keluar.

Karena kita telah mendeklarasikan anotasi @ EnableOauth2Sso , Spring Boot menambahkan kacang OAuth2ClientContext dalam cakupan permintaan. Berdasarkan ini, kita dapat membuat OAuth2RestTemplate kita sendiri di aplikasi klien kita:

@Bean public OAuth2RestOperations restOperations( OAuth2ProtectedResourceDetails resource, OAuth2ClientContext context) { return new OAuth2RestTemplate(resource, context); }

Setelah kami mengkonfigurasi kacang , konteksnya akan meneruskan token akses ke layanan yang diminta dan juga akan menyegarkan token jika kedaluwarsa.

4. Menyampaikan Token OAuth Menggunakan RestTemplate

Kami sebelumnya mendefinisikan restOperations kacang jenis OAuth2RestTemplate dalam aplikasi Client kami. Hasilnya, kita bisa menggunakan metode getForObject () dari OAuth2RestTemplate untuk mengirim permintaan dengan token yang diperlukan ke server Sumber Daya yang dilindungi dari klien kita.

Pertama, mari kita tentukan titik akhir yang membutuhkan otentikasi di Server Sumber Daya kita:

@GetMapping("/person") @PreAuthorize("hasAnyRole('ADMIN', 'USER')") public @ResponseBody Person personInfo(){ return new Person("abir", "Dhaka", "Bangladesh", 29, "Male"); } 

Ini adalah titik akhir REST sederhana yang mengembalikan representasi JSON dari objek Person .

Sekarang, kita bisa mengirim permintaan dari aplikasi Klien menggunakan metode getForObject () yang akan menyampaikan token ke Resource Server :

@Autowired private RestOperations restOperations; @GetMapping("/personInfo") public ModelAndView person() { ModelAndView mav = new ModelAndView("personinfo"); String personResourceUrl = "//localhost:9000/person"; mav.addObject("person", restOperations.getForObject(personResourceUrl, String.class)); return mav; }

5. Konfigurasi Zuul untuk Token Relay

If we'd like to relay a token downstream to the proxy services, we can use Spring Cloud Zuul Embedded Reverse Proxy.

First, we need to add the Maven dependency for working with Zuul:

 org.springframework.cloud spring-cloud-starter-netflix-zuul 

Next, we need to add the @EnableZuulProxy annotation on to our configuration class in the Client application:

@Configuration @EnableOAuth2Sso @EnableZuulProxy public class SiteSecurityConfigurer extends WebSecurityConfigurerAdapter { //... }

All that's left to do is add the Zuul configuration properties to our application.yml file:

zuul: sensitiveHeaders: Cookie,Set-Cookie routes: resource: path: /api/** url: //localhost:9000 user: path: /user/** url: //localhost:9000/user

Any request coming to the /api endpoint of the Client application will be redirected to the Resource Server URL. We also need to provide the URL of the user credentials endpoint.

6. Conclusion

Dalam artikel singkat ini, kami mempelajari cara menggunakan Spring Cloud Security dengan OAuth2 dan Zuul untuk mengonfigurasi otorisasi aman dan server sumber daya, serta cara merelai token OAuth2 antar server menggunakan Oauth2RestTemplate dan Embedded Zuul Proxy.

Seperti biasa, kode tersedia di GitHub.