5.5. 登出處理
當使用了 WebSecurityConfigurerAdapter 就會自動開啟登出的功能,預設會用 /logout 路徑讓使用者登出,並執行以下的動作:
- 註銷該 HTTP Session
- 清除已設定的記得我驗證
- 清空 SecurityContextHolder
- 重新導向到 /login?logout
不過就如同登入設定,登出設定也有很多種選項可以依需求客製:
protected void configure(HttpSecurity http) throws Exception {
	http
		.logout()                                       // 1.
			.logoutUrl("/my/logout")                    // 2.
			.logoutSuccessUrl("/my/index")              // 3.
			.logoutSuccessHandler(logoutSuccessHandler) // 4.
			.invalidateHttpSession(true)                // 5.
			.addLogoutHandler(logoutHandler)            // 6.
			.deleteCookies(cookieNamesToClear)          // 7.
			.and()
		...
}
- 提供登出功能的支援,當使用了 WebSecurityConfigurerAdapter就會自動支援此功能
- 設定觸發登出功能的 URL,預設為 /logout。注意如果開啟預設的 CSRF 保護機制,那此請求必須是 POST,詳細參考 JavaDoc
- 登出後會重新導向的 URL,預設是 /login?logout,詳細參考 JavaDoc
- 容許提供自訂的 LogoutSuccessHandler,如果有列出此項,則logoutSuccessUrl()的部分會被忽略,詳細參考 JavaDoc
- 設定登出後是否要註銷 HttpSession,預設為true,此項其實是在背後對SecurityContextLogoutHandler做設定,詳細參考 JavaDoc
- 加入 LogoutHandler。預設會將SecurityContextLogoutHandler作為最後一個LogoutHandler加入
- 設定成功登出後要刪除的 cookie 名稱,其實等於加入 CookieClearingLogoutHandler
登出當然也可以透過 XML 命名空間的方式做設定
為了讓登出順利運作,通常會加上 LogoutHandler 跟 LogoutSuccessHandler 的實作。在許多常見的情況,Spring Security 會在背後以 流式接口(方法鍊式調用) 來加上這些 handler。
5.5.1. LogoutHandler
一般來說,LogoutHandler 的實作包括那些可以參與登出處理的類別,這些類別通常都被調用來做某些必要的清除動作,因此他們不應該拋出例外。
Spring Security 提供許多不同的實作:
- PersistentTokenBasedRememberMeServices
- TokenBasedRememberMeServices
- CookieClearingLogoutHandler
- CsrfLogoutHandler
- SecurityContextLogoutHandler
細節請參考 18.4. 記得我介面及實作。
除了直接提供 LogoutHandler 的實作,流式接口在背後有提供對應 LogoutHandler 實作的捷徑方法,例如 deleteCookies() 方法允許你指定一個或多個 cookie 的名字,以在成功登出後移除它們,這個方法等於加入 CookieClearingLogoutHandler。
5.5.2. LogoutSuccessHandler
在 LogoutFilter 成功登出後,LogoutSuccessHandler 會被呼叫來處理例如重新導向到合適的目的地等動作。注意這個介面與 LogoutHandler 幾乎一樣,但是可能會拋出例外。
Spring Security 提供以下實作:
如同前一個段落提到的,你不需要直接加上 SimpleUrlLogoutSuccessHandler,可以改用 logoutSuccessUrl(),這同樣會在背後設定好 SimpleUrlLogoutSuccessHandler,在登出動作發生時會導向到提供的 URL,預設是 /login?logout。
如果是在 REST API 的情境下,HttpStatusReturningLogoutSuccessHandler 就會很有趣唷,啾咪 ^.<
這個 LogoutSuccessHandler 允許在登出成功後,返回你提供的 HTTP 狀態碼,而不是轉向某個 URL,如果沒有特別設定,預設會返回狀態碼 200。
5.5.3. 其他跟 Logout 相關的參考
- 6.2.4. 登出處理
- 12.3.2. 測試登出
- 16.2.3. HttpServletRequest.logout()
- 18.4. 記得我介面及實作
- 19.5.3. 登出及 CSRF 注意事項
- 34.3.2. 單一登出 (CAS 協議)
- 43.1.26 <logout>命名空間標籤