SpringSecurity退出功能實現的正確方式
本文將介紹在Spring Security框架下如何實現用戶的”退出”logout的功能。其實這是一個非常簡單的功能,我見過很多的程序員在使用了Spring Security之後,仍然去自己寫controller方法實現logout功能,這種做法就好像耕地,你有机械設備你不用,你非要用牛。
一、logout最簡及最佳實踐
其實使用Spring Security進行logout非常簡單,只需要在spring Security配置類配置項上加上這樣一行代碼:http.logout()。關於spring Security配置類的其他很多實現、如:HttpBasic模式、formLogin模式、自定義登錄驗證結果、使用權限表達式、session會話管理,在本號的之前的文章已經都寫過了。本節的核心內容就是在原有配置的基礎上,加上這樣一行代碼: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" >退出</a>
logout功能我們就完成了。實際上的核心代碼只有兩行。
二、默認的logout做了什麼?
雖然我們簡簡單單的實現了logout功能,是不是還不足夠放心?我們下面就來看一下Spring Security默認在logout過程中幫我們做了哪些動作。
- 當前session失效,即:logout的核心需求,session失效就是訪問權限的回收。
- 刪除當前用戶的 remember-me“記住我”功能信息
- clear清除當前的 SecurityContext
- 重定向到登錄頁面,loginPage配置項指定的頁面
通常對於一個應用來講,以上動作就是logout功能所需要具備的功能了。
三、個性化配置
雖然Spring Security默認使用了/logout作為退出處理請求路徑,登錄頁面作為退出之後的跳轉頁面。這符合絕大多數的應用的開發邏輯,但有的時候我們需要一些個性化設置,如下:
http.logout()
.logoutUrl("/signout")
.logoutSuccessUrl("/aftersignout.html")
.deleteCookies("JSESSIONID")
- 通過指定logoutUrl配置改變退出請求的默認路徑,當然html退出按鈕的請求url也要修改
- 通過指定logoutSuccessUrl配置,來顯式指定退出之後的跳轉頁面
- 還可以使用deleteCookies刪除指定的cookie,參數為cookie的名稱
四、LogoutSuccessHandler
如果上面的個性化配置,仍然滿足不了您的應用需求。可能您的應用需要在logout的時候,做一些特殊動作,比如登錄時長計算,清理業務相關的數據等等。你可以通過實現LogoutSuccessHandler 接口來實現你的業務邏輯。
@Component
public class MyLogoutSuccessHandler implements LogoutSuccessHandler {
@Override
public void onLogoutSuccess(HttpServletRequest request,
HttpServletResponse response,
Authentication authentication)
throws IOException, ServletException {
//這裏書寫你自己的退出業務邏輯
// 重定向到登錄頁
response.sendRedirect("/login.html");
}
}
然後進行配置使其生效,核心代碼就是一行logoutSuccessHandler。注意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);
}
}
期待您的關注
- 博主最近新寫了一本書:
- 本文轉載註明出處(必須帶連接,不能只轉文字):。
本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】
※為什麼 USB CONNECTOR 是電子產業重要的元件?
※網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!
※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光
※想知道最厲害的台北網頁設計公司推薦、台中網頁設計公司推薦專業設計師”嚨底家”!!