1. 概述
本文是基于前文表单登录基础上的创建的,讲解如何使用Spring Security实现注销功能。
2. 基本配置
使用logout()
配置Spring注销功能非常简单:
@Configuration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(final HttpSecurity http) throws Exception {
http
//...
.logout()
//...
}
//...
}
对应的XML配置:
<http>
...
<logout/>
</http>
Spring Security默认注销URL为/logout
(Spring Security 4前为/j_spring_security_logout
)
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中的其他配置类似,可以修改默认的注销地址 - /logout
。
.logout()
.logoutUrl("/perform_logout")
XML方式:
<logout
logout-success-url="/anonymous.html"
logout-url="/perform_logout" />
4.3. invalidateHttpSession 与 deleteCookies
执行注销时,invalidateHttpSession
控制是否清空session
,默认为true
。deleteCookies()
:要删除的cookie。
.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()
对于一些高级场景,我们可以自定义LogoutSuccessHandler
@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
来实现。例如,一个简单的审计机制,需要记录用户注销前访问的最后一个页面:
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);
}
}
同时,需要注意:LogoutSuccessHandle
与logoutSuccessUrl
只能二选一。因为两者功能类似,如果设置了LogoutSuccessHandler
则logoutSuccessUrl
设置无效。
5. 总结
本文中,我们首先使用Spring Security配置了一个简单的注销示例,然后讨论了一些更高级的选项。
本文实现源代码存放在GitHub – 这是一个基于Eclipse的项目,所以很容易导入和运行。
项目启动后, 访问http://localhost:8080/spring-security-mvc-login/login.html