Logout Manual Dengan Keamanan Pegas

1. Perkenalan

Keamanan Pegas adalah standar untuk mengamankan aplikasi berbasis Pegas. Ini memiliki beberapa fitur untuk mengelola otentikasi pengguna, termasuk login dan logout.

Dalam tutorial ini, kita akan fokus pada logout manual dengan Spring Security.

Kami akan berasumsi bahwa pembaca sudah memahami proses logout Keamanan Musim Semi standar.

2. Logout Dasar

Saat pengguna mencoba keluar, ini memiliki beberapa konsekuensi pada status sesi saat ini . Kami perlu menghancurkan sesi dengan dua langkah:

  1. Informasi sesi HTTP tidak valid.
  2. Hapus Konteks Keamanan karena berisi informasi otentikasi.

Kedua tindakan tersebut dilakukan oleh SecurityContextLogoutHandler.

Mari kita lihat itu beraksi:

@Configuration public class DefaultLogoutConfiguration extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .logout(logout -> logout .logoutUrl("/basic/basiclogout") .addLogoutHandler(new SecurityContextLogoutHandler()) ); } }

Perhatikan bahwa SecurityContextLogoutHandler ditambahkan oleh Spring Security secara default - kami hanya menampilkannya di sini untuk kejelasan.

3. Keluar dari Cookie Clearing

Seringkali, logout juga mengharuskan kami untuk menghapus beberapa atau semua cookie pengguna.

Kita dapat membuat LogoutHandler kita sendiri yang mengulang semua cookie dan kedaluwarsa saat logout:

@Configuration public class AllCookieClearingLogoutConfiguration extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .logout(logout -> logout .logoutUrl("/cookies/cookielogout") .addLogoutHandler((request, response, auth) -> { for (Cookie cookie : request.getCookies()) { String cookieName = cookie.getName(); Cookie cookieToDelete = new Cookie(cookieName, null); cookieToDelete.setMaxAge(0); response.addCookie(cookieToDelete); } }) ); } }

Di sisi lain, Spring Security menyediakan CookieClearingLogoutHandler yang merupakan penangan logout yang siap digunakan untuk penghapusan cookie.

4. Hapus-Situs-Data Header Keluar

Alternatifnya, kita dapat menggunakan header respon HTTP khusus untuk mencapai hal yang sama; di sinilah header Clear-Site-Data berperan. The Clear-data-Site Clears sundulan yang sedang berada data (cookies, penyimpanan, cache) yang terkait dengan situs web yang meminta:

@Configuration public class ClearSiteDataHeaderLogoutConfiguration extends WebSecurityConfigurerAdapter { private static final ClearSiteDataHeaderWriter.Directive[] SOURCE = {CACHE, COOKIES, STORAGE, EXECUTION_CONTEXTS}; @Override protected void configure(HttpSecurity http) throws Exception { http .logout(logout -> logout .logoutUrl("/csd/csdlogout") .addLogoutHandler(new HeaderWriterLogoutHandler(new ClearSiteDataHeaderWriter(SOURCE))) ); } }

Perhatikan bahwa pembersihan penyimpanan dapat merusak status aplikasi saat kami menghapus hanya satu jenis penyimpanan. Oleh karena itu, karena Kliring Tidak Lengkap, header hanya diterapkan jika permintaan aman.

5. Kesimpulan

Keamanan Musim Semi memiliki banyak fitur bawaan untuk menangani skenario otentikasi. Itu selalu berguna untuk menguasai cara menggunakan fitur-fitur itu secara terprogram.

Seperti biasa, kode untuk contoh ini tersedia di GitHub.