Перейти к основному содержимому

Выход из Spring Security

· 3 мин. чтения

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. ВыходУспехУрл()

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

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

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

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

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

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

4.2. URL-адрес выхода()

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

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

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

И через XML:

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

4.3. невалидироватьHttpSession и удалитьCookies

Эти два расширенных атрибута управляют аннулированием сеанса, а также списком файлов 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" />

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

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

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

5. Вывод

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

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

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

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