«1. Обзор

Эта статья построена на основе нашего учебника по входу в форму и сосредоточена на том, как настроить выход из системы с помощью Spring Security.

2. Базовая конфигурация

Базовая конфигурация функциональности Spring Logout с использованием метода logout() достаточно проста:

@Configuration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(final HttpSecurity http) throws Exception {
        http
          //...
          .logout()
          //...
   }
   //...
}

И с использованием конфигурации XML:

<http>

    ...    
    <logout/>

</http>

Элемент включает выход по умолчанию механизм — который настроен на использование следующего URL-адреса выхода: /logout, который раньше был /j_spring_security_logout до Spring Security 4.

3. JSP и ссылка выхода

Продолжая этот простой пример, способ предоставить ссылка для выхода из веб-приложения:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
   <head></head>
   <body>
      <a href="<c:url value="/logout" />">Logout</a>
   </body>
</html>

4. Дополнительные настройки

4.1. logoutSuccessUrl()

После успешного завершения процесса выхода Spring Security перенаправит пользователя на указанную страницу. По умолчанию это корневая страница («/»), но ее можно настроить:

//...
.logout()
.logoutSuccessUrl("/afterlogout.html")
//...

Это также можно сделать с помощью конфигурации XML:

<logout logout-success-url="/afterlogout.html" />

В зависимости от приложения рекомендуется заключается в перенаправлении пользователя обратно на страницу входа:

//...
.logout()
.logoutSuccessUrl("/login.html")
//...

4.2. logoutUrl()

Подобно другим значениям по умолчанию в Spring Security, URL-адрес, который фактически запускает механизм выхода из системы, также имеет значение по умолчанию — /logout.

Однако рекомендуется изменить это значение по умолчанию, чтобы убедиться, что информация о том, какая структура используется для защиты приложения, не публикуется:

.logout()
.logoutUrl("/perform_logout")

И через XML:

<logout 
  logout-success-url="/anonymous.html" 
  logout-url="/perform_logout" />

~~ ~ 4.3. invalidateHttpSession и deleteCookies

Эти два расширенных атрибута управляют аннулированием сеанса, а также списком файлов cookie, которые должны быть удалены при выходе пользователя из системы. Таким образом, invalidateHttpSession позволяет настроить сеанс таким образом, чтобы он не становился недействительным при выходе из системы (по умолчанию это значение true).

Метод deleteCookies также прост:

.logout()
.logoutUrl("/perform_logout")
.invalidateHttpSession(true)
.deleteCookies("JSESSIONID")

И версия XML:

<logout 
  logout-success-url="/anonymous.html" 
  logout-url="/perform_logout"
  delete-cookies="JSESSIONID" />

4.4. logoutSuccessHandler()

Для более сложных сценариев, когда пространство имен недостаточно гибко, bean-компонент LogoutSuccessHandler из контекста Spring можно заменить пользовательской ссылкой:

@Bean
public LogoutSuccessHandler logoutSuccessHandler() {
    return new CustomLogoutSuccessHandler();
}

//...
.logout()
.logoutSuccessHandler(logoutSuccessHandler());
//...

Эквивалентная конфигурация XML:

<logout 
  logout-url="/perform_logout"
  delete-cookies="JSESSIONID"
  success-handler-ref="customLogoutSuccessHandler" />

...
<beans:bean name="customUrlLogoutSuccessHandler" />

~ ~~ Любая пользовательская логика приложения, которая должна запускаться, когда пользователь успешно выходит из системы, может быть реализована с помощью пользовательского обработчика успешного выхода из системы. Например, простой механизм аудита, отслеживающий последнюю страницу, на которой был пользователь, когда он инициировал выход из системы: направляется после выхода из системы. Из-за этого объединение атрибута logoutSuccessHandler с logoutSuccessUrl не будет работать, так как оба имеют схожие функции.

public class CustomLogoutSuccessHandler extends 
  SimpleUrlLogoutSuccessHandler implements LogoutSuccessHandler {

    @Autowired 
    private AuditService auditService; 

    @Override
    public void onLogoutSuccess(
      HttpServletRequest request, 
      HttpServletResponse response, 
      Authentication authentication) 
      throws IOException, ServletException {
 
        String refererUrl = request.getHeader("Referer");
        auditService.track("Logout from: " + refererUrl);

        super.onLogoutSuccess(request, response, authentication);
    }
}

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

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

Реализацию этого руководства по выходу из системы Spring можно найти в проекте GitHub — это проект на основе Eclipse, поэтому его легко импортировать и запускать как есть.

Когда проект выполняется локально, доступ к образцу HTML можно получить по адресу:

http://localhost:8080/spring-security-mvc-login/login.html

«