1. 概述
本文建立在我们的表单登录教程之上,将重点关注如何使用 Spring Security 配置注销。
2. 基本配置
使用logout()
方法的Spring Logout 功能的基本配置非常简单:
@Configuration
@EnableWebSecurity
public class SecSecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
//...
.logout()
//...
}
//...
}
和 XML 版本:
<http>
...
<logout/>
</http>
该元素启用默认注销机制——配置为使用以下注销 url:/logout
. 在Spring Security 4之前是 /j_spring_security_logout
。
3. JSP 和 注销链接
继续这个简单的例子,在 Web 应用程序中提供注销链接的方法是:
<%@ 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()
对于更高级的场景,命名空间不够灵活,可以用自定义引用替换 Spring 上下文中的LogoutSuccessHandler bean:
@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);
}
}
📝注意: 此自定义 bean 有责任确定用户在注销后被定向到的目的地。因此,将logoutSuccessHandler属性与logoutSuccessUrl配对是行不通的,因为两者都包含相似的功能。
5. 结论
在此示例中,我们首先使用 Spring Security 设置一个简单的注销示例,然后我们讨论了更高级的可用选项。
这个 Spring Logout 教程的实现可以在GitHub 项目中找到——这是一个基于 Eclipse 的项目,所以应该很容易导入和运行。
当项目在本地运行时,可以在以下位置访问示例 HTML: