1. 程式人生 > 程式設計 >SpringSecurity退出功能實現的正確方式(推薦)

SpringSecurity退出功能實現的正確方式(推薦)

spring security 簡介

spring security 的核心功能主要包括:

  • 認證 (你是誰)
  • 授權 (你能幹什麼)
  • 攻擊防護 (防止偽造身份)

其核心就是一組過濾器鏈,專案啟動後將會自動配置。最核心的就是 Basic Authentication Filter 用來認證使用者的身份,一個在spring security中一種過濾器處理一種認證方式。

本文將介紹在Spring Security框架下如何實現使用者的"退出"logout的功能。其實這是一個非常簡單的功能,我見過很多的程式設計師在使用了Spring Security之後,仍然去自己寫controller方法實現logout功能,這種做法就好像耕地,你有機械裝置你不用,你非要用牛。

一、logout最簡及最佳實踐

其實使用Spring Security進行logout非常簡單,只需要在spring Security配置類配置項上加上這樣一行程式碼:http.logout()。關於spring Security配置類的其他很多實現、如:HttpBasic模式、formLogin模式、自定義登入驗證結果、使用許可權表示式、session會話管理,在本號的之前的文章已經都寫過了。本節的核心內容就是在原有配置的基礎上,加上這樣一行程式碼:http.logout()。

@Configuration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {
  @Override
  protected void configure(final HttpSecurity http) throws Exception {
    http.logout();
  }
}

加上logout配置之後,在你的“退出”按鈕上使用/logtou作為請求登出的路徑。

<a href="/logout" rel="external nofollow" >退出</a>

logout功能我們就完成了。實際上的核心程式碼只有兩行。

二、預設的logout做了什麼?

雖然我們簡簡單單的實現了logout功能,是不是還不足夠放心?我們下面就來看一下Spring Security預設在logout過程中幫我們做了哪些動作。

  • 當前session失效,即:logout的核心需求,session失效就是訪問許可權的回收。
  • 刪除當前使用者的 remember-me“記住我”功能資訊
  • clear清除當前的 SecurityContext
  • 重定向到登入頁面,loginPage配置項指定的頁面

通常對於一個應用來講,以上動作就是logout功能所需要具備的功能了。

三、個性化配置

雖然Spring Security預設使用了/logout作為退出處理請求路徑,登入頁面作為退出之後的跳轉頁面。這符合絕大多數的應用的開發邏輯,但有的時候我們需要一些個性化設定,如下:

 http.logout()
   .logoutUrl("/signout")
   .logoutSuccessUrl("/aftersignout.html")
   .deleteCookies("JSESSIONID")

  • 通過指定logoutUrl配置改變退出請求的預設路徑,當然html退出按鈕的請求url也要修改
  • 通過指定logoutSuccessUrl配置,來顯式指定退出之後的跳轉頁面
  • 還可以使用deleteCookies刪除指定的cookie,引數為cookie的名稱

四、LogoutSuccessHandler

如果上面的個性化配置,仍然滿足不了您的應用需求。可能您的應用需要在logout的時候,做一些特殊動作,比如登入時長計算,清理業務相關的資料等等。你可以通過實現LogoutSuccessHandler 介面來實現你的業務邏輯。

@Component
public class MyLogoutSuccessHandler implements LogoutSuccessHandler {
  
  @Override
  public void onLogoutSuccess(HttpServletRequest request,HttpServletResponse response,Authentication authentication) 
                throws IOException,ServletException {
    //這裡書寫你自己的退出業務邏輯
    
    // 重定向到登入頁
    response.sendRedirect("/login.html");
  }
}

然後進行配置使其生效,核心程式碼就是一行logoutSuccessHandler。注意logoutSuccessUrl不要與logoutSuccessHandler一起使用,否則logoutSuccessHandler將失效。

@Configuration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {
  
@Autowired
  private MyLogoutSuccessHandler myLogoutSuccessHandler;

  @Override
  protected void configure(final HttpSecurity http) throws Exception {
     http.logout()
       .logoutUrl("/signout")
       //.logoutSuccessUrl(``"/aftersignout.html"``)
       .deleteCookies("JSESSIONID")
       //自定義logoutSuccessHandler
       .logoutSuccessHandler(myLogoutSuccessHandler);  
  }
}

總結

以上所述是小編給大家介紹的SpringSecurity退出功能實現的正確方式,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對我們網站的支援!
如果你覺得本文對你有幫助,歡迎轉載,煩請註明出處,謝謝!