Cara Melumpuhkan Pengalihan Log Keluar Keselamatan Musim Semi

1. Gambaran keseluruhan

Dalam tutorial ringkas ini, kita akan melihat dengan teliti cara menonaktifkan pengalihan keluar di Spring Security .

Kita mulakan dengan latar belakang ringkas mengenai bagaimana aliran keluar berfungsi di Spring Security. Kemudian, kami akan menerangkan, melalui contoh praktikal, bagaimana mengelakkan pengalihan pengguna setelah berjaya keluar.

2. Log keluar di Spring Security

Ringkasnya, Spring Security memberikan sokongan luar kotak untuk mekanisme logout melalui kaedah logout () DSL. Pada dasarnya, Spring Security mencetuskan log keluar apabila pengguna memukul URL log keluar lalai iaitu / logout .

Perlu dinyatakan bahawa nilai lalai dari URL logout adalah / j_spring_security_logout sebelum Spring Security 4 .

Spring Security menawarkan kemungkinan untuk mengarahkan pengguna ke URL tertentu setelah log keluar. Namun, ada beberapa ketika kita mahu mengelakkan tingkah laku ini.

Jadi, tanpa basa-basi lagi, mari kita lihat bagaimana menerapkan logik melumpuhkan pengalihan keluar di Spring Security .

3. Lumpuhkan Pengalihan Keluar Keselamatan Musim Semi

Secara lalai, Spring Security mengarahkan pengguna ke / logout selepas logout berjaya. Oleh itu, di bahagian ini, kita akan memfokuskan cara untuk mengelakkan pengalihan pengguna ke halaman log masuk setelah log keluar.

Perhatikan bahawa kita boleh mengganti URL ubah hala lalai dengan bantuan kaedah logoutSuccessUrl () DSL .

Perkara utama di sini adalah untuk menunjukkan cara mengelakkan pengalihan semasa URL / logout dipanggil dari klien REST.

Sebenarnya, antara muka Log keluarSuccessHandler menawarkan cara yang fleksibel untuk melaksanakan logik tersuai apabila proses logout berjaya dilakukan.

Jadi di sini, kami akan menggunakan LogoutSuccessHandler khusus untuk mengembalikan hanya kod status 200 yang bersih . Dengan begitu, ia tidak akan mengarahkan kami ke halaman mana pun.

Sekarang, mari kita laksanakan konfigurasi Keselamatan Musim Semi yang diperlukan untuk mematikan pengalihan keluar:

@Configuration @EnableWebSecurity public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests(authz -> authz .mvcMatchers("/login").permitAll() .anyRequest().authenticated() ) .logout(logout -> logout .permitAll() .logoutSuccessHandler((request, response, authentication) -> { response.setStatus(HttpServletResponse.SC_OK); } ); } }

Bahagian penting yang perlu diberi perhatian dari konfigurasi di atas adalah kaedah logoutSuccessHandler () . Seperti yang kita lihat, kita menggunakan ungkapan lambda untuk menentukan pengendali kejayaan log keluar tersuai kita.

Ingatlah bahawa kita juga dapat membuat kelas pelaksanaan sederhana antara muka LogoutSuccessHandler dan menggunakan DSL untuk meneruskannya ke kaedah logoutSuccessHandler () .

4. Ujian

Sekarang setelah kita mengumpulkan semua bahagian, mari kita uji titik akhir / logout untuk mengesahkan bahawa semuanya berfungsi seperti yang diharapkan.

Perhatikan bahawa kami akan menggunakan MockMvc untuk menghantar / logout permintaan dalam ujian kami.

Pertama, mari buat kelas ujian sederhana dan suntik objek MockMvc di dalamnya:

public class LogoutApplicationUnitTest { @Autowired private MockMvc mockMvc; // test case }

Sekarang, mari tulis kaedah untuk menguji titik akhir / logout kami :

@Test public void whenLogout_thenDisableRedirect() throws Exception { this.mockMvc.perform(post("/logout").with(csrf())) .andExpect(status().isOk()) .andExpect(jsonPath("$").doesNotExist()) .andExpect(unauthenticated()) .andReturn(); }

Akhir sekali, mari cuba pecahkan kod ujian kami:

  • perform (post (“/ logout”)) memanggil titik akhir / logout sebagai permintaan POST yang mudah
  • dengan (csrf ()) menambahkan parameter _csrf yang diharapkan pada pertanyaan
  • status () mengembalikan kod status tindak balas HTTP
  • jsonPath () membolehkan untuk mengakses dan memeriksa badan respons HTTP

5. Kesimpulan

Ringkasnya, kami telah menerangkan dan menggambarkan bagaimana menangani cabaran untuk melumpuhkan pengalihan keluar di Spring Security dan Spring Boot.

Seperti biasa, kod sumber lengkap untuk artikel ini terdapat di GitHub.