Рубрики
Без рубрики

Ручной Выход Из Системы С Пружинной Защитой

Узнайте, как выполнить ручной выход из системы с помощью Spring Security.

Автор оригинала: baeldung.

1. введение

Безопасность пружин является стандартом для обеспечения безопасности приложений на основе пружин. Он имеет несколько функций для управления аутентификацией пользователя, включая вход в систему и выход из системы.

В этом уроке мы сосредоточимся на ручном выходе из системы с помощью Spring Security.

Мы предположим, что читатели уже понимают стандартный Процесс выхода из системы безопасности Spring .

2. Основной выход из системы

Когда пользователь пытается выйти из системы, это имеет несколько последствий для его текущего состояния сеанса . Нам нужно уничтожить сеанс двумя шагами:

  1. Аннулировать информацию о сеансе HTTP.
  2. Четкий Контекст безопасности поскольку он содержит информацию об аутентификации.

Эти два действия выполняются 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. Выход из системы Очистки файлов cookie

Часто выход из системы также требует, чтобы мы очистили некоторые или все файлы cookie пользователя.

Мы можем создать свой собственный LogoutHandler , который просматривает все файлы cookie и истекает при выходе из системы:

@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 , который является готовым к использованию обработчиком выхода из системы для удаления файлов cookie.

4. Выход из заголовка Clear-Site-Data

В качестве альтернативы мы можем использовать специальный заголовок HTTP-ответа для достижения той же цели; именно здесь в игру вступает заголовок Clear-Site-Data . Заголовок Clear-Data-Site очищает данные просмотра (файлы cookie, хранилище, кэш), связанные с запрашивающим веб-сайтом:

@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 .