Pengenalan Keselamatan Awan Musim Semi

1. Gambaran keseluruhan

Modul Spring Cloud Security menyediakan ciri-ciri yang berkaitan dengan keselamatan berasaskan token dalam aplikasi Spring Boot.

Secara khusus, ia menjadikan SSO berasaskan OAuth2 lebih mudah - dengan sokongan untuk menyampaikan token antara Resource Servers, serta mengkonfigurasi pengesahan hilir menggunakan proksi Zuul yang tersemat.

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

Perhatikan bahawa untuk contoh ini, kami hanya mempunyai satu aplikasi Pelanggan yang menggunakan SSO untuk menunjukkan ciri keselamatan awan - tetapi dalam senario biasa, kami akan mempunyai sekurang-kurangnya dua aplikasi klien untuk membenarkan perlunya Single Sign-On.

2. Memulakan Aplikasi Keselamatan Awan dengan pantas

Mari mulakan dengan mengkonfigurasi SSO dalam aplikasi Spring Boot.

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

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

Ini juga akan membawa kebergantungan keselamatan musim bunga-awan-starter .

Kita boleh mengkonfigurasi mana-mana laman sosial sebagai Pelayan Auth untuk laman web kita atau kita boleh menggunakan pelayan kita sendiri. Dalam kes kami, kami telah memilih pilihan terakhir dan mengkonfigurasi aplikasi yang berfungsi sebagai Pelayan Pengesahan - yang digunakan secara tempatan di // localhost: 7070 / authserver.

Pelayan kebenaran kami menggunakan token JWT.

Selain itu, untuk mana-mana Pelanggan dapat mengambil bukti kelayakan pengguna, kami perlu mengkonfigurasi Pelayan Sumber kami, berjalan di port 9000, dengan titik akhir yang dapat melayani kelayakan ini.

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

Untuk maklumat lebih lanjut mengenai cara menyediakan Pelayan Pengesahan dan Pelayan Sumber, lihat artikel kami sebelumnya di sini.

Kami kini dapat menambahkan anotasi dalam kelas konfigurasi dalam aplikasi Pelanggan kami:

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

Segala permintaan yang memerlukan pengesahan akan dialihkan ke Pelayan Pengesahan. Untuk berfungsi, kita juga harus menentukan sifat pelayan:

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 bahawa kita perlu mempunyai keselamatan spring-boot-starter di classpath kita untuk memastikan konfigurasi di atas berfungsi.

3. Token Akses Relay

Semasa menyampaikan token, Pelanggan OAuth2 meneruskan token OAuth2 yang diterima olehnya ke permintaan sumber keluar.

Oleh kerana kami telah menyatakan anotasi @ EnableOauth2Sso , Spring Boot menambah kacang OAuth2ClientContext dalam ruang lingkup permintaan. Berdasarkan ini, kami dapat membuat OAuth2RestTemplate kami sendiri dalam aplikasi pelanggan kami:

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

Setelah kami mengkonfigurasi kacang , konteks akan meneruskan token akses ke perkhidmatan yang diminta dan juga akan menyegarkan token jika kadaluarsa.

4. Menyampaikan Token OAuth Menggunakan RestTemplate

Kami sebelum ini ditakrifkan restOperations kacang jenis OAuth2RestTemplate dalam permohonan Pelanggan kami. Hasilnya, kita boleh menggunakan getForObject () kaedah OAuth2RestTemplate menghantar permintaan dengan token perlu untuk pelayan Sumber dilindungi dari pelanggan kami.

Pertama, mari tentukan titik akhir yang memerlukan pengesahan di Pelayan Sumber kami:

@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 dapat mengirim permintaan dari aplikasi Klien menggunakan kaedah getForObject () yang akan menyampaikan token ke Pelayan Sumber :

@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. Mengkonfigurasi Zuul untuk Token Relay

Sekiranya kami ingin menyampaikan token ke hilir ke perkhidmatan proksi, kami boleh menggunakan Spring Cloud Zuul Embedded Reverse Proxy.

Pertama, kita perlu menambahkan kebergantungan Maven untuk bekerja dengan Zuul:

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

Seterusnya, kita perlu menambahkan anotasi @ EnableZuulProxy ke kelas konfigurasi kami dalam aplikasi Pelanggan:

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

Yang tinggal hanyalah menambahkan sifat konfigurasi Zuul ke fail application.yml kami :

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

Segala permintaan yang datang ke / api endpoint aplikasi Klien akan dialihkan ke URL Pelayan Sumber. Kami juga perlu memberikan URL titik akhir kelayakan pengguna.

6. Kesimpulannya

Dalam artikel ringkas ini, kami meneroka cara menggunakan Spring Cloud Security dengan OAuth2 dan Zuul untuk mengkonfigurasi kebenaran dan pelayan sumber yang selamat, serta cara menyampaikan token OAuth2 antara pelayan yang menggunakan Oauth2RestTemplate dan Proxy Zuul Tertanam.

Seperti biasa, kodnya tersedia di GitHub.