本篇介紹如何在Spring Boot的Spring Security自訂登出(logout)邏輯。
請先參考Spring Boot + Spring Security 基本配置設定教學進行Spring Security的設定。
Spring Security登出時預設使用SecurityContextLogoutHandler
來處理登出邏輯,包過以下動作:
- 使目前請求的
HttpSession
無效, - 清除
Authentication
, - 清除目前執行緒的
SecurityContext
資訊。
如果需要在登出前執行一些額外的處理邏輯,可以建立自訂的登出處理器類別DemoLogoutHandler
如下,需實作LogoutHandler
介面。記得掛上@Component
使其被掃描成註冊為Spring Bean。
DemoLogoutHandler
package com.abc.demo.config.security;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.authentication.logout.LogoutHandler;
import org.springframework.stereotype.Component;
/** 自訂Spring Security 登出處理器 */
@Component
public class DemoLogoutHandler implements LogoutHandler {
@Override
public void logout(HttpServletRequest request,
HttpServletResponse response,
Authentication authentication) {
System.out.println("DemoLogoutHandler.logout()"); // 登出時在console印出的訊息
// 在這可以加登出時要做的其他邏輯,例如記log資訊儲存到資料庫等
// add additional custom logout logic...
}
}
接著在Spring Security配置類別DemoWebSecurityConfig
中使用LogoutConfigurer.addLogoutHandler()
加入自訂的登出處理器DemoLogoutHandler
,如此登出時便會使用DemoLogoutHandler
此來處理登出時的額外邏輯。
DemoWebSecurityConfig
package com.abc.demo.config.security;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@EnableWebSecurity
public class DemoWebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private DemoLogoutHandler demoLogoutHandler; // 注入自訂處理器的實例
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest()
.authenticated()
.and().formLogin()
.and().httpBasic()
.and()
.logout().addLogoutHandler(demoLogoutHandler); // 新增自訂的登出處理器
}
}
完成以上配置後,啟動專案在瀏覽器輸入http://localhost:8080/demo
進入登入畫面,
使用Spring Security預設的帳號密碼登入。
Spring Security預設登出頁面路徑為/logout
,所以登入後在瀏覽器輸入http://localhost:8080/demo/logout
便會進入預設的登出頁面。
點擊[Log Out]按鈕登出。
Spring Secuirty會先執行DemoLogoutHandler.logout()
並在console印出下面結果;
最後才會執行SecurityContextLogoutHandler.logout()
進行實際的登出邏輯。
DemoLogoutHandler.logout()
登出後Spring Security預設會導向回登入畫面如下
範例專案結構如下。
參考:
沒有留言:
張貼留言