SpringSecurity退出功能實(shí)現(xiàn)的正確方式(推薦)
spring security 簡介
spring security 的核心功能主要包括:
- 認(rèn)證 (你是誰)
- 授權(quán) (你能干什么)
- 攻擊防護(hù) (防止偽造身份)
其核心就是一組過濾器鏈,項(xiàng)目啟動后將會自動配置。最核心的就是 Basic Authentication Filter 用來認(rèn)證用戶的身份,一個(gè)在spring security中一種過濾器處理一種認(rèn)證方式。
本文將介紹在Spring Security框架下如何實(shí)現(xiàn)用戶的"退出"logout的功能。其實(shí)這是一個(gè)非常簡單的功能,我見過很多的程序員在使用了Spring Security之后,仍然去自己寫controller方法實(shí)現(xiàn)logout功能,這種做法就好像耕地,你有機(jī)械設(shè)備你不用,你非要用牛。
一、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)指定的頁面
通常對于一個(gè)應(yīng)用來講,以上動作就是logout功能所需要具備的功能了。
三、個(gè)性化配置
雖然Spring Security默認(rèn)使用了/logout作為退出處理請求路徑,登錄頁面作為退出之后的跳轉(zhuǎn)頁面。這符合絕大多數(shù)的應(yīng)用的開發(fā)邏輯,但有的時(shí)候我們需要一些個(gè)性化設(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
如果上面的個(gè)性化配置,仍然滿足不了您的應(yīng)用需求??赡苣膽?yīng)用需要在logout的時(shí)候,做一些特殊動作,比如登錄時(shí)長計(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)的正確方式,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
- Spring Security實(shí)現(xiàn)兩周內(nèi)自動登錄"記住我"功能
- 詳解使用Spring Security進(jìn)行自動登錄驗(yàn)證
- SpringSecurity動態(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)下次自動登錄功能過程解析
相關(guān)文章
Java map.getOrDefault()方法的用法詳解
這篇文章主要介紹了Java map.getOrDefault()方法的用法詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
Spring Boot 集成Shiro的多realm配置過程
這篇文章主要介紹了Spring Boot 集成Shiro的多realm配置,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
如何解決java:找不到符號符號:類__(使用了lombok的注解)
在使用IntelliJ IDEA開發(fā)Java項(xiàng)目時(shí),可能遇到通過@lombok注解自動生成get和set方法不生效的問題,解決這一問題需要幾個(gè)步驟,首先,確認(rèn)Lombok插件已在IDEA中安裝并啟用,其次,確保項(xiàng)目中已添加Lombok的依賴,對于Maven和Gradle項(xiàng)目2024-10-10
SpringBoot獲取application.properties文件中文亂碼問題及解決
這篇文章主要介紹了SpringBoot獲取application.properties文件中文亂碼問題及解決,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
springboot實(shí)現(xiàn)多模塊項(xiàng)目添加一新模塊
這篇文章主要介紹了springboot實(shí)現(xiàn)多模塊項(xiàng)目添加一新模塊,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
關(guān)于SpringMVC中數(shù)據(jù)綁定@ModelAttribute注解的使用
這篇文章主要介紹了關(guān)于SpringMVC中數(shù)據(jù)綁定@ModelAttribute注解的使用,SpringMVC是一個(gè)基于Spring框架的Web框架,它提供了一種簡單、靈活的方式來開發(fā)Web應(yīng)用程序,在開發(fā)Web應(yīng)用程序時(shí),我們需要將用戶提交的數(shù)據(jù)綁定到我們的Java對象上,需要的朋友可以參考下2023-07-07

