OAuth2 - @EnableResourceServer vs @ EnableOAuth2Sso

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan membincangkan tentang anotasi @EnableResourceServer dan @ EnableOAuth2Sso di Spring Security.

Kita akan mulakan dengan menjelaskan perbezaan antara Pelanggan OAuth2 dan Pelayan Sumber OAuth2 . Selepas itu, kami akan membincangkan sedikit tentang apa yang dapat dibuat oleh anotasi ini dan menunjukkan penggunaannya dengan contoh menggunakan Zuul dan API ringkas.

Untuk tujuan artikel ini, kami akan menganggap beberapa pengalaman yang sudah ada dengan Zuul dan OAuth2 .

Sekiranya anda tidak mempunyai apa-apa atau merasakan bahawa tinjauan salah satu daripadanya akan sangat membantu, sila rujuk gambaran umum ringkas mengenai Zuul dan panduan kami untuk OAuth2 .

2. Pelayan Pelanggan dan Sumber OAuth2

Terdapat empat peranan berbeza dalam OAuth2 yang perlu kita pertimbangkan:

  • Pemilik Sumber - entiti yang dapat memberikan akses ke sumber yang dilindungi
  • Pelayan Pengesahan - memberi token akses kepada Pelanggan setelah berjaya mengesahkan Pemilik Sumber dan mendapat kebenaran mereka
  • Pelayan Sumber - komponen yang memerlukan token akses untuk membenarkan, atau sekurang-kurangnya mempertimbangkan, akses ke sumbernya
  • Pelanggan - entiti yang mampu memperoleh token akses dari pelayan kebenaran

Mengelaskan kelas konfigurasi kami dengan @EnableResourceServer , atau @ EnableOAuth2Sso , mengarahkan Spring untuk mengkonfigurasi komponen yang mengubah aplikasi kami menjadi salah satu daripada dua peranan terakhir yang disebutkan di atas.

The @EnableResourceServer anotasi membolehkan permohonan kami untuk berkelakuan sebagai Server Sumber dengan mengkonfigurasi yang OAuth2AuthenticationProcessingFilter dan komponen sama penting lain .

Lihat kelas ResourceServerSecurityConfigurer untuk mendapatkan idea yang lebih baik mengenai apa yang dikonfigurasi di belakang tabir.

Sebaliknya, yang @ EnableOAuth2Sso anotasi mengubah permohonan kami ke dalam klien OAuth2 . Ini memerintahkan Spring untuk mengkonfigurasi OAuth2ClientAuthenticationProcessingFilter , bersama dengan komponen lain yang diperlukan oleh aplikasi kami untuk mendapatkan token akses dari pelayan kebenaran.

Sila lihat di SsoSecurityConfigurer kelas untuk maklumat lanjut mengenai apa yang dikonfigurasi Spring untuk kita.

Menggabungkan anotasi ini dengan beberapa sifat membolehkan kita menyiapkan dan menjalankan dengan cepat. Mari buat dua aplikasi berbeza untuk melihatnya beraksi dan bagaimana mereka dapat saling melengkapi:

  • Aplikasi pertama kami akan menjadi simpul tepi kami, aplikasi Zuul sederhana yang akan menggunakan anotasi @ EnableOAuth2Sso . Ini akan bertanggungjawab untuk mengesahkan pengguna (dengan bantuan Server Pengesahan ) dan mendelegasikan permintaan masuk ke aplikasi lain
  • Aplikasi kedua akan menggunakan anotasi @EnableResourceServer dan akan membenarkan akses ke sumber yang dilindungi jika permintaan masuk mengandungi token akses OAuth2 yang sah

3. Zuul - @ EnableOAuth2Sso

Mari mulakan dengan membuat aplikasi Zuul yang akan bertindak sebagai simpul tepi kami dan akan bertanggungjawab untuk mengesahkan pengguna menggunakan Pelayan Pengesahan OAuth2 :

@Configuration @EnableZuulProxy @EnableOAuth2Sso @Order(value = 0) public class AppConfiguration extends WebSecurityConfigurerAdapter { @Autowired private ResourceServerTokenServices resourceServerTokenServices; @Override public void configure(HttpSecurity http) throws Exception { http.csrf().disable() .authorizeRequests() .antMatchers("/authorization-server-1/**", "/login").permitAll() .anyRequest().authenticated().and() .logout().permitAll().logoutSuccessUrl("/"); } }

Memberi penjelasan mengenai aplikasi Zuul kami dengan @ EnableOAuth2Sso juga memberitahu Spring untuk mengkonfigurasi penapis OAuth2TokenRelayFilter . Penapis ini mengambil token akses yang diperoleh sebelumnya dari sesi HTTP pengguna dan menyebarkannya ke hilir.

Perhatikan bahawa kami juga menggunakan anotasi @Order di kelas konfigurasi AppConfiguration kami . Ini untuk memastikan bahawa Penapis yang dibuat oleh WebSecurityConfigurerAdapter kami lebih diutamakan daripada Penapis yang dibuat oleh WebSecurityConfigurerAdapters yang lain .

Sebagai contoh, kami dapat memberi penjelasan kepada aplikasi Zuul kami dengan @EnableResourceServer untuk menyokong pengecam Sesi HTTP dan token akses OAuth2. Namun, dengan itu membuat Penapis baru yang secara lalai, lebih diutamakan daripada yang dibuat oleh kelas AppConfiguration . Ini berlaku kerana ResouceServerConfiguration , kelas konfigurasi yang dipicu oleh @EnableResourceServer , menentukan urutan lalai 3 sementara WebSecurityConfigureAdapter mempunyai urutan lalai 100.

Sebelum beralih ke Pelayan Sumber , kita perlu mengkonfigurasi beberapa sifat:

zuul: routes: resource-server-mvc-1: /resource-server-mvc-1/** authorization-server-1: sensitiveHeaders: Authorization path: /authorization-server-1/** stripPrefix: false add-proxy-headers: true security: basic: enabled: false oauth2: sso: loginPath: /login client: accessTokenUri: //localhost:8769/authorization-server-1/oauth/token userAuthorizationUri: /authorization-server-1/oauth/authorize clientId: fooClient clientSecret: fooSecret resource: jwt: keyValue: "abc" id: fooScope serviceId: ${PREFIX:}resource

Tanpa terlalu terperinci, menggunakan konfigurasi ini, kami adalah:

  • Mengkonfigurasi laluan Zuul kami dan mengatakan tajuk mana yang harus ditambahkan / dikeluarkan sebelum menghantar permintaan ke hilir.
  • Menetapkan beberapa sifat OAuth2 agar aplikasi kita dapat berkomunikasi dengan Pelayan Pengesahan dan mengkonfigurasi JWT dengan enkripsi simetri .

4. API - @EnableResourceServer

Sekarang kita mempunyai aplikasi Zuul , mari buat Server Sumber :

@SpringBootApplication @EnableResourceServer @Controller @RequestMapping("/") class ResourceServerApplication { public static void main(String[] args) { SpringApplication.run(ResourceServerApplication.class, args); } @RequestMapping(method = RequestMethod.GET) @ResponseBody public String helloWorld(Principal principal) { return "Hello " + principal.getName(); } }

Ia adalah satu permohonan yang mudah yang mendedahkan titik akhir tunggal untuk mengembalikan nama daripada Principal yang memulakan permintaan itu.

Mari selesaikan dengan mengkonfigurasi beberapa sifat:

security: basic: enabled: false oauth2: resource: jwt: keyValue: "abc" id: fooScope service-id: ${PREFIX:}resource

Perlu diingat bahawa kami memerlukan token akses yang sah (yang disimpan dalam Sesi HTTP pengguna di simpul tepi kami) untuk mengakses titik akhir Pelayan Sumber kami .

5. Kesimpulan

Dalam artikel ini, kami menerangkan perbezaan antara anotasi @ EnableOAuth2Sso dan @EnableResourceServer . Kami juga menunjukkan cara menggunakannya dengan contoh praktikal menggunakan Zuul dan API ringkas.

Pelaksanaan penuh contoh ini boleh didapati di Github.

Semasa menjalankan secara tempatan, kita dapat menjalankan dan menguji aplikasi di //192.168.1.67:8765/resource-server-mvc-1