1. 概述
本文檔基於我們的表單登錄教程,將重點介紹如何配置 使用 Spring Security 註銷。
2. 基本配置
使用 Spring Logout 功能
@Configuration
@EnableWebSecurity
public class SecSecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
//...
.logout()
//...
}
//...
}
並且使用 XML 配置:
<http>
...
<logout/>
</http>
該元素啓用默認的登出機制——它配置為使用以下 登出 URL:/logout,之前是 /j_spring_security_logout,在 Spring Security 4。
3. JSP 和註銷鏈接
繼續這個簡單的示例,在 Web 應用程序中提供 註銷鏈接 的方法是:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head></head>
<body>
<a href="<c:url value="/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 Context 中的 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,然後討論了更多高級選項。
當項目在本地運行時,該示例 HTML 可在以下位置訪問: