Log Keluar Manual Dengan Keselamatan Musim Semi

1. Pengenalan

Spring Security adalah standard untuk mendapatkan aplikasi berasaskan Spring. Ia mempunyai beberapa ciri untuk menguruskan pengesahan pengguna, termasuk log masuk dan log keluar.

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

Kami akan menganggap bahawa pembaca sudah memahami proses log keluar Spring Security standard.

2. Log Keluar Asas

Apabila pengguna mencuba log keluar, ia mempunyai beberapa akibat pada keadaan sesinya sekarang . Kita perlu menghancurkan sesi dengan dua langkah:

  1. Maklumat sesi HTTP tidak sah.
  2. Kosongkan SecurityContext kerana mengandungi maklumat pengesahan.

Kedua-dua tindakan tersebut dilakukan oleh SecurityContextLogoutHandler.

Mari kita lihat dalam tindakan:

@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 bahawa SecurityContextLogoutHandler ditambahkan oleh Spring Security secara lalai - kami hanya menunjukkannya di sini untuk kejelasan.

3. Log Keluar Kuki

Selalunya, logout juga menghendaki kami membersihkan beberapa atau semua kuki pengguna.

Kita boleh membuat LogoutHandler kita sendiri yang melewati semua kuki dan akan habis tempohnya semasa 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); } }) ); } }

Sebaliknya, Spring Security menyediakan CookieClearingLogoutHandler yang merupakan pengendali logout yang siap digunakan untuk penghapusan kuki.

4. Log Keluar Header Data-Clear

Sebagai alternatif, kita boleh menggunakan tajuk respons HTTP khas untuk mencapai perkara yang sama; di sinilah tajuk Clear-Site-Data dimainkan. The Clear-Data-laman Clears header melayari data (cookies, penyimpanan, cache) yang dikaitkan dengan laman 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 bahawa pembersihan storan mungkin merosakkan keadaan aplikasi apabila kita hanya membersihkan satu jenis storan. Oleh itu, kerana Pembersihan Tidak Selesai, tajuk hanya digunakan jika permintaan itu selamat.

5. Kesimpulan

Spring Security mempunyai banyak ciri terbina dalam untuk menangani senario pengesahan. Selalu berguna untuk menguasai bagaimana menggunakan ciri-ciri tersebut secara terprogram.

Seperti biasa, kod untuk contoh ini boleh didapati di GitHub.