SpringSecurity退出功能實現的正確方式

file

本文將介紹在Spring Security框架下如何實現用戶的"退出"logout的功能。其實這是一個很是簡單的功能,我見過不少的程序員在使用了Spring Security以後,仍然去本身寫controller方法實現logout功能,這種作法就好像耕地,你有機械設備你不用,你非要用牛。html

1、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做爲請求登出的路徑。spring

<a href="/logout">退出</a>

logout功能咱們就完成了。實際上的核心代碼只有兩行。springboot

2、默認的logout作了什麼?

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

  • 當前session失效,即:logout的核心需求,session失效就是訪問權限的回收。
  • 刪除當前用戶的 remember-me「記住我」功能信息
  • clear清除當前的 SecurityContext
  • 重定向到登陸頁面,loginPage配置項指定的頁面

一般對於一個應用來說,以上動做就是logout功能所須要具有的功能了。session

3、個性化配置

雖然Spring Security默認使用了/logout做爲退出處理請求路徑,登陸頁面做爲退出以後的跳轉頁面。這符合絕大多數的應用的開發邏輯,但有的時候咱們須要一些個性化設置,以下:框架

http.logout()
     .logoutUrl("/signout")
     .logoutSuccessUrl("/aftersignout.html")
     .deleteCookies("JSESSIONID")
  • 經過指定logoutUrl配置改變退出請求的默認路徑,固然html退出按鈕的請求url也要修改
  • 經過指定logoutSuccessUrl配置,來顯式指定退出以後的跳轉頁面
  • 還可使用deleteCookies刪除指定的cookie,參數爲cookie的名稱

4、LogoutSuccessHandler

若是上面的個性化配置,仍然知足不了您的應用需求。可能您的應用須要在logout的時候,作一些特殊動做,好比登陸時長計算,清理業務相關的數據等等。你能夠經過實現LogoutSuccessHandler 接口來實現你的業務邏輯。ide

@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);   
   }
}

期待您的關注

相關文章
相關標籤/搜索