SpringSecurity退出功能實現(xiàn)的正確方式(推薦)
spring security 簡介
spring security 的核心功能主要包括:
- 認(rèn)證 (你是誰)
- 授權(quán) (你能干什么)
- 攻擊防護(hù) (防止偽造身份)
其核心就是一組過濾器鏈,項目啟動后將會自動配置。最核心的就是 Basic Authentication Filter 用來認(rèn)證用戶的身份,一個在spring security中一種過濾器處理一種認(rèn)證方式。
本文將介紹在Spring Security框架下如何實現(xiàn)用戶的"退出"logout的功能。其實這是一個非常簡單的功能,我見過很多的程序員在使用了Spring Security之后,仍然去自己寫controller方法實現(xiàn)logout功能,這種做法就好像耕地,你有機(jī)械設(shè)備你不用,你非要用牛。
一、logout最簡及最佳實踐
其實使用Spring Security進(jìn)行l(wèi)ogout非常簡單,只需要在spring Security配置類配置項上加上這樣一行代碼:http.logout()。關(guān)于spring Security配置類的其他很多實現(xiàn)、如:HttpBasic模式、formLogin模式、自定義登錄驗證結(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功能我們就完成了。實際上的核心代碼只有兩行。
二、默認(rèn)的logout做了什么?
雖然我們簡簡單單的實現(xiàn)了logout功能,是不是還不足夠放心?我們下面就來看一下Spring Security默認(rèn)在logout過程中幫我們做了哪些動作。
- 當(dāng)前session失效,即:logout的核心需求,session失效就是訪問權(quán)限的回收。
- 刪除當(dāng)前用戶的 remember-me“記住我”功能信息
- clear清除當(dāng)前的 SecurityContext
- 重定向到登錄頁面,loginPage配置項指定的頁面
通常對于一個應(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的時候,做一些特殊動作,比如登錄時長計算,清理業(yè)務(wù)相關(guān)的數(shù)據(jù)等等。你可以通過實現(xiàn)LogoutSuccessHandler 接口來實現(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); } }
總結(jié)
以上所述是小編給大家介紹的SpringSecurity退出功能實現(xiàn)的正確方式,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
- Spring Security實現(xiàn)兩周內(nèi)自動登錄"記住我"功能
- 詳解使用Spring Security進(jìn)行自動登錄驗證
- SpringSecurity動態(tài)加載用戶角色權(quán)限實現(xiàn)登錄及鑒權(quán)功能
- 解析SpringSecurity自定義登錄驗證成功與失敗的結(jié)果處理問題
- Spring Security Remember me使用及原理詳解
- Spring Security基本配置方法解析
- 使用Spring Security OAuth2實現(xiàn)單點(diǎn)登錄
- spring security實現(xiàn)下次自動登錄功能過程解析
相關(guān)文章
Java統(tǒng)計英文句子中出現(xiàn)次數(shù)最多的單詞并計算出現(xiàn)次數(shù)的方法
這篇文章主要介紹了Java統(tǒng)計英文句子中出現(xiàn)次數(shù)最多的單詞并計算出現(xiàn)次數(shù)的方法,涉及java針對英文句子的字符串遍歷、轉(zhuǎn)換、正則替換、計算等相關(guān)操作技巧,需要的朋友可以參考下2018-01-01Java中的對象、類、抽象類、接口、繼承之間的聯(lián)系
這篇文章主要介紹了Java中的對象、類、抽象類、接口、繼承之間的聯(lián)系,文章講解的很清晰,有不太懂的同學(xué)可以多研究下2021-02-02Java使用Condition實現(xiàn)精準(zhǔn)喚醒線程詳解
這篇文章主要為大家詳細(xì)介紹了Java如何使用Condition實現(xiàn)精準(zhǔn)喚醒線程效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-02-02Java正則表達(dá)式matcher.group()用法代碼
這篇文章主要給大家介紹了關(guān)于Java正則表達(dá)式matcher.group()用法的相關(guān)資料,最近在做一個項目,需要使用matcher.group()方法匹配出需要的內(nèi)容,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下2023-08-08Java實現(xiàn)FIFO任務(wù)調(diào)度隊列策略
在工作中,很多高并發(fā)的場景中,我們會用到隊列來實現(xiàn)大量的任務(wù)請求。當(dāng)任務(wù)需要某些特殊資源的時候,我們還需要合理的分配資源,讓隊列中的任務(wù)高效且有序完成任務(wù)。本文將為大家介紹通過java實現(xiàn)FIFO任務(wù)調(diào)度,需要的可以參考一下2021-12-12詳解Java如何實現(xiàn)一個BlockingQueue
這篇文章主要為大家詳細(xì)介紹了Java如何實現(xiàn)一個BlockingQueue阻塞隊列,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-06-06Java并發(fā)編程之代碼實現(xiàn)兩玩家交換裝備
這篇文章主要介紹了Java并發(fā)編程之代碼實現(xiàn)兩玩家交換裝備,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有一定的幫助,需要的朋友可以參考下2021-09-09