Cara Menonaktifkan Pengalihan Logout Keamanan Musim Semi

1. Ikhtisar

Dalam tutorial singkat ini, kita akan melihat lebih dekat cara menonaktifkan pengalihan logout di Keamanan Musim Semi .

Pertama-tama kita akan mulai dengan latar belakang singkat tentang cara kerja aliran logout di Keamanan Musim Semi. Kemudian, kami akan mengilustrasikan, melalui contoh praktis, cara menghindari pengalihan pengguna setelah berhasil keluar.

2. Keluar di Keamanan Musim Semi

Singkatnya, Spring Security menyediakan dukungan out-of-box untuk mekanisme logout melalui metode DSL logout () . Pada dasarnya, Spring Security memicu logout saat pengguna menekan URL logout default yaitu / logout .

Perlu disebutkan bahwa nilai default dari URL logout adalah / j_spring_security_logout sebelum Spring Security 4 .

Keamanan Musim Semi menawarkan kemungkinan untuk mengarahkan pengguna ke URL tertentu setelah keluar. Namun, ada kalanya kita ingin menghindari perilaku ini.

Jadi, tanpa basa-basi lagi, mari kita lihat bagaimana menerapkan logika menonaktifkan pengalihan logout di Keamanan Musim Semi .

3. Nonaktifkan Pengalihan Logout Keamanan Musim Semi

Secara default, Spring Security mengarahkan pengguna ke / login? Logout setelah berhasil logout. Jadi, di bagian ini, kita akan fokus pada bagaimana mencegah pengalihan pengguna ke halaman login setelah keluar.

Perhatikan bahwa kita dapat mengganti URL pengalihan default dengan bantuan metode DSL logoutSuccessUrl () .

Poin utama di sini adalah untuk menunjukkan bagaimana menghindari pengalihan ketika URL / logout dipanggil dari klien REST.

Faktanya, antarmuka Log outSuccessHandler menawarkan cara yang fleksibel untuk menjalankan logika kustom saat proses logout berhasil dilakukan.

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

Sekarang, mari terapkan konfigurasi Keamanan Musim Semi yang diperlukan untuk menonaktifkan pengalihan logout:

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

Bagian penting yang perlu diperhatikan dari konfigurasi di atas adalah metode logoutSuccessHandler () . Seperti yang bisa kita lihat, kita menggunakan ekspresi lambda untuk menentukan penangan sukses logout kustom kita.

Ingatlah bahwa kita juga dapat membuat kelas implementasi sederhana dari antarmuka LogoutSuccessHandler dan menggunakan DSL untuk meneruskannya ke metode logoutSuccessHandler () .

4. Pengujian

Sekarang setelah kita menggabungkan semua bagian, mari kita uji titik akhir / logout untuk mengonfirmasi bahwa semuanya berfungsi seperti yang diharapkan.

Perhatikan bahwa kami akan menggunakan MockMvc untuk mengirim / permintaan logout dalam pengujian kami.

Pertama, mari buat kelas pengujian sederhana dan masukkan objek MockMvc di dalamnya:

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

Sekarang, mari tulis metode untuk menguji titik akhir / logout kita :

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

Terakhir, mari kita coba memecah kode pengujian kita:

  • perform (post ("/ logout")) memanggil endpoint / logout sebagai permintaan POST sederhana
  • dengan (csrf ()) menambahkan parameter _csrf yang diharapkan ke kueri
  • status () mengembalikan kode status dari respons HTTP
  • jsonPath () memungkinkan untuk mengakses dan memeriksa isi respons HTTP

5. Kesimpulan

Singkatnya, kami telah menjelaskan dan mengilustrasikan cara mengatasi tantangan menonaktifkan pengalihan logout di Keamanan Musim Semi dan Boot Musim Semi.

Seperti biasa, kode sumber lengkap untuk artikel ini tersedia di GitHub.