溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

使用SpringSecurity怎么實(shí)現(xiàn)一個退出功能

發(fā)布時間:2021-05-31 17:42:14 來源:億速云 閱讀:184 作者:Leah 欄目:編程語言

使用SpringSecurity怎么實(shí)現(xiàn)一個退出功能?針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

一、logout最簡及最佳實(shí)踐

其實(shí)使用Spring Security進(jìn)行l(wèi)ogout非常簡單,只需要在spring Security配置類配置項(xiàng)上加上這樣一行代碼:http.logout()。關(guān)于spring Security配置類的其他很多實(shí)現(xiàn)、如:HttpBasic模式、formLogin模式、自定義登錄驗(yàn)證結(jié)果、使用權(quán)限表達(dá)式、session會話管理,在本號的之前的文章已經(jīng)都寫過了。本節(jié)的核心內(nèi)容就是在原有配置的基礎(chǔ)上,加上這樣一行代碼: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功能我們就完成了。實(shí)際上的核心代碼只有兩行。

二、默認(rèn)的logout做了什么?

雖然我們簡簡單單的實(shí)現(xiàn)了logout功能,是不是還不足夠放心?我們下面就來看一下Spring Security默認(rèn)在logout過程中幫我們做了哪些動作。

  • 當(dāng)前session失效,即:logout的核心需求,session失效就是訪問權(quán)限的回收。

  • 刪除當(dāng)前用戶的 remember-me“記住我”功能信息

  • clear清除當(dāng)前的 SecurityContext

  • 重定向到登錄頁面,loginPage配置項(xiàng)指定的頁面

通常對于一個應(yīng)用來講,以上動作就是logout功能所需要具備的功能了。

三、個性化配置

雖然Spring Security默認(rèn)使用了/logout作為退出處理請求路徑,登錄頁面作為退出之后的跳轉(zhuǎn)頁面。這符合絕大多數(shù)的應(yīng)用的開發(fā)邏輯,但有的時候我們需要一些個性化設(shè)置,如下:

 http.logout()
   .logoutUrl("/signout")
   .logoutSuccessUrl("/aftersignout.html")
   .deleteCookies("JSESSIONID")
  • 通過指定logoutUrl配置改變退出請求的默認(rèn)路徑,當(dāng)然html退出按鈕的請求url也要修改

  • 通過指定logoutSuccessUrl配置,來顯式指定退出之后的跳轉(zhuǎn)頁面

  • 還可以使用deleteCookies刪除指定的cookie,參數(shù)為cookie的名稱

四、LogoutSuccessHandler

如果上面的個性化配置,仍然滿足不了您的應(yīng)用需求。可能您的應(yīng)用需要在logout的時候,做一些特殊動作,比如登錄時長計(jì)算,清理業(yè)務(wù)相關(guān)的數(shù)據(jù)等等。你可以通過實(shí)現(xiàn)LogoutSuccessHandler 接口來實(shí)現(xiàn)你的業(yè)務(wù)邏輯。

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

然后進(jìn)行配置使其生效,核心代碼就是一行l(wèi)ogoutSuccessHandler。注意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);  
  }
}

關(guān)于使用SpringSecurity怎么實(shí)現(xiàn)一個退出功能問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI