Spring Boot退出登入注意點

banq發表於2021-05-17

退出登入Loginout是任何安全應用程式不可或缺的一部分。登出確保客戶執行退出後,所有敏感資訊都將被刪除或失效。Spring Security在會話中儲存認證資訊。Spring Security為應用程式自動處理以下任務。
  1. 使HTTP會話無效。
  2. 清理所有RememberMe身份驗證配置。
  3. 清除SecurityContextHolder。
  4. 將使用者重定向到配置的頁面。

在本文中,我們將使用spring boot來檢查登出功能。

GitHub儲存庫下載完整的應用程式。
由於Spring安全性將在登出過程中處理大部分繁重的工作,因此我們只需要為擴充套件WebSecurityConfigurerAdapter的自定義安全性配置類配置一些細節。這是啟用logout登出功能的基本配置:

protected void configure(HttpSecurity http) throws Exception {
    http
        .logout(logout -> logout                                                                              
        );
}

啟用登出功能時,我們應牢記以下幾點:
  1. 成功登出後,預設情況下,客戶將重定向到/login?logout。Spring安全性提供了更改URL的靈活性。
  2. 如果CSRF保護處於活動狀態(預設),Spring Security希望登出請求必須是POST型別,我們可以GET透過禁用CSRF保護來使用登出請求。

如果您需要對登出流程進行更多控制,以下是完整的參考:

protected void configure(HttpSecurity http) throws Exception {
    http
        .logout(logout -> logout                                                
            .logoutUrl("/my/logout")                                            
            .logoutSuccessUrl("/home")                                      
            .logoutSuccessHandler(logoutSuccessHandler)                         
            .invalidateHttpSession(true)                                        
            .addLogoutHandler(logoutHandler)                                    
            .deleteCookies(cookieNamesToClear)                                  
        )
}

  • logoutSuccessURL–幫助將使用者重定向到登入頁面登出,預設值為預設值/login?logout(在本例中,我們將重定向到主頁)。
  • logoutSuccessHandler–處理程式,在登出完成後觸發。我們可以使用它來處理重定向或轉發到目的地。請注意,如果我們配置logoutSuccessHandler,logoutSuccessUrl()將會忽略。
  • invalidateHttpSession–控制HTTP會話是否應該無效。預設值是true。
  • deleteCookies–刪除所有安全cookie(以防我們在登入時進行設定。)

要自定義登出功能,可以透過新增LogoutHandler和/或LogoutSuccessHandler實現。
 

Logout登出使用者介面
我們需要為客戶提供選擇,以單擊登出logout連結。Spring Security提供了以下2個選項:

  1. 執行POST登出(這是預設設定,建議這樣做)。
  2. 透過禁用CSRF功能執行GET登出。

如果您無法執行POST請求並希望回退到GET登出請求,則需要在應用程式中進行以下更改。
  1. 禁用CSRF。
  2. 將POST請求轉換為UI上的GET。

protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable()
    ...
}


 

相關文章