使用SpringSecurity怎么實(shí)現(xiàn)一個(gè)退出功能?針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。
創(chuàng)新互聯(lián)建站提供高防服務(wù)器、云服務(wù)器、香港服務(wù)器、達(dá)州服務(wù)器托管等
一、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)都寫(xiě)過(guò)了。本節(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)求登出的路徑。
退出
logout功能我們就完成了。實(shí)際上的核心代碼只有兩行。
二、默認(rèn)的logout做了什么?
雖然我們簡(jiǎn)簡(jiǎn)單單的實(shí)現(xiàn)了logout功能,是不是還不足夠放心?我們下面就來(lái)看一下Spring Security默認(rèn)在logout過(guò)程中幫我們做了哪些動(dòng)作。
當(dāng)前session失效,即:logout的核心需求,session失效就是訪問(wèn)權(quán)限的回收。
刪除當(dāng)前用戶的 remember-me“記住我”功能信息
clear清除當(dāng)前的 SecurityContext
重定向到登錄頁(yè)面,loginPage配置項(xiàng)指定的頁(yè)面
通常對(duì)于一個(gè)應(yīng)用來(lái)講,以上動(dòng)作就是logout功能所需要具備的功能了。
三、個(gè)性化配置
雖然Spring Security默認(rèn)使用了/logout作為退出處理請(qǐng)求路徑,登錄頁(yè)面作為退出之后的跳轉(zhuǎn)頁(yè)面。這符合絕大多數(shù)的應(yīng)用的開(kāi)發(fā)邏輯,但有的時(shí)候我們需要一些個(gè)性化設(shè)置,如下:
http.logout() .logoutUrl("/signout") .logoutSuccessUrl("/aftersignout.html") .deleteCookies("JSESSIONID")
通過(guò)指定logoutUrl配置改變退出請(qǐng)求的默認(rèn)路徑,當(dāng)然html退出按鈕的請(qǐng)求url也要修改
通過(guò)指定logoutSuccessUrl配置,來(lái)顯式指定退出之后的跳轉(zhuǎn)頁(yè)面
還可以使用deleteCookies刪除指定的cookie,參數(shù)為cookie的名稱
四、LogoutSuccessHandler
如果上面的個(gè)性化配置,仍然滿足不了您的應(yīng)用需求??赡苣膽?yīng)用需要在logout的時(shí)候,做一些特殊動(dòng)作,比如登錄時(shí)長(zhǎng)計(jì)算,清理業(yè)務(wù)相關(guān)的數(shù)據(jù)等等。你可以通過(guò)實(shí)現(xiàn)LogoutSuccessHandler 接口來(lái)實(shí)現(xiàn)你的業(yè)務(wù)邏輯。
@Component public class MyLogoutSuccessHandler implements LogoutSuccessHandler { @Override public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { //這里書(shū)寫(xiě)你自己的退出業(yè)務(wù)邏輯 // 重定向到登錄頁(yè) 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)一個(gè)退出功能問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。