網頁

2019/11/22

Spring Boot Security 自訂登出處理器 custom logout handler

本篇介紹如何在Spring Boot的Spring Security自訂登出(logout)邏輯。


請先參考Spring Boot + Spring Security 基本配置設定教學進行Spring Security的設定。


Spring Security登出時預設使用SecurityContextLogoutHandler來處理登出邏輯,包過以下動作:


如果需要在登出前執行一些額外的處理邏輯,可以建立自訂的登出處理器類別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預設會導向回登入畫面如下



範例專案結構如下。




參考:

沒有留言:

張貼留言