Ръчно излизане с пролетна сигурност

1. Въведение

Spring Security е стандартът за защита на приложения, базирани на Spring. Той има няколко функции за управление на удостоверяването на потребителя, включително влизане и излизане.

В този урок ще се съсредоточим върху ръчното излизане с Spring Security.

Ще приемем, че читателите вече разбират стандартния процес на излизане от Spring Security.

2. Основно излизане

Когато потребител се опита да излезе, това има няколко последствия за текущото състояние на сесията . Трябва да унищожим сесията с две стъпки:

  1. Деактивирайте информацията за HTTP сесия.
  2. Изчистете SecurityContext, тъй като съдържа информация за удостоверяване.

Тези две действия се изпълняват от SecurityContextLogoutHandler.

Нека да видим това в действие:

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

Имайте предвид, че SecurityContextLogoutHandler е добавен от Spring Security по подразбиране - ние просто го показваме тук за по-голяма яснота.

3. Изход от изчистване на бисквитки

Често излизането изисква също така да изчистим някои или всички бисквитки на потребителя.

Можем да създадем свой собствен LogoutHandler, който се придържа към всички бисквитки и ги изтича при излизане:

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

От друга страна, Spring Security предоставя CookieClearingLogoutHandler, който е готов за използване манипулатор за излизане за премахване на бисквитки.

4. Изход от заглавката Clear-Site-Data

Като алтернатива можем да използваме специален заглавие на HTTP отговор, за да постигнем същото; тук влиза в сила заглавката Clear-Site-Data . На Clear-Data-сайта заглавни проясни разглеждащи данни (бисквитки, съхранение, кеш), свързани с дадената интернет страница:

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

Имайте предвид, че почистването на хранилището може да повреди състоянието на приложението, когато изчистим само един тип хранилище. Следователно, поради Непълно изчистване, заглавката се прилага само ако заявката е защитена.

5. Заключение

Spring Security има много вградени функции за обработка на сценарии за удостоверяване. Винаги е полезно да овладеете как да използвате тези функции програмно.

Както винаги, кодът за тези примери е достъпен в GitHub.