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