javascript
springsecurity 登录失败_Spring Security 实战干货: 401和403状态
1. 前言
最近幾篇我對Spring Security中用戶認(rèn)證流程進(jìn)行了分析,同時(shí)在分析的基礎(chǔ)上我們實(shí)現(xiàn)了一個驗(yàn)證碼登錄認(rèn)證的實(shí)戰(zhàn)功能。當(dāng)認(rèn)證失敗后交給了AuthenticationFailureHandler來進(jìn)行失敗后的邏輯處理。今天來談?wù)剝蓚€和認(rèn)證授權(quán)息息相關(guān)的兩個狀態(tài)401和403以及它們?nèi)绾卧赟pring Security融入體系中的。
2. 401 未授權(quán)
我在RFC 7235[1]中找到了相關(guān)的表述。當(dāng)客戶端收到401狀態(tài)碼時(shí),表明了該請求因?yàn)槿狈α吮恍湃蔚恼J(rèn)證憑據(jù)而被拒絕訪問目標(biāo)資源。
如果用戶在請求中攜帶了認(rèn)證憑據(jù),那么401響應(yīng)表明該憑據(jù)是未授信的,不能訪問目標(biāo)資源。服務(wù)端的態(tài)度是用戶應(yīng)當(dāng)再次進(jìn)行嘗試,并且應(yīng)該引導(dǎo)客戶端至少再嘗試一次。比如,用戶輸錯了密碼,服務(wù)器應(yīng)該告訴用戶密碼錯誤,并再次進(jìn)行嘗試。
3. 403 禁止訪問
表述參見RFC 7231[2]。403狀態(tài)代碼表示服務(wù)器已理解了客戶端的請求,但拒絕授權(quán)。如果請求中提供了身份驗(yàn)證憑據(jù),則服務(wù)器認(rèn)為它們不足以授予訪問權(quán)限。客戶端不應(yīng)自動攜帶相同的重復(fù)證書再次請求。但是,出于某些原因,請求可能被禁止與憑據(jù)無關(guān)。如果服務(wù)器認(rèn)為這些反饋信息比較敏感,可以用404來代替。
4. Spring Security 中的這兩種狀態(tài)
通常情況Spring Security中的401和403兩種狀態(tài)都是以異常的形式來進(jìn)行體現(xiàn)的,由AuthenticationException和AccessDeniedException兩套異常體系承擔(dān)。它們相關(guān)接口有AuthenticationEntryPoint、AuthenticationFailureHandler和AccessDeniedHandler。僅僅當(dāng)?shù)卿浾J(rèn)證失敗返回了401,其它情況的這兩種異常都返回了403。
Spring Security異常處理體系默認(rèn)情況下他們都會被轉(zhuǎn)發(fā)到異常頁面。然而目前在前后端分離的架構(gòu)下,返回JSON才是更加合適的。所以我們需要針對以上幾個接口進(jìn)行定制化實(shí)現(xiàn)來滿足前后端分離的需要。
其實(shí)重新實(shí)現(xiàn)AuthenticationEntryPoint和AccessDeniedHandler即可。因?yàn)?strong>Spring Security已經(jīng)提供了下面這個實(shí)現(xiàn)供登錄失敗使用:
public?class?AuthenticationEntryPointFailureHandler?implements?AuthenticationFailureHandler?{???private?final?AuthenticationEntryPoint?authenticationEntryPoint;
???public?AuthenticationEntryPointFailureHandler(AuthenticationEntryPoint?authenticationEntryPoint)?{
??????Assert.notNull(authenticationEntryPoint,?"authenticationEntryPoint?cannot?be?null");
??????this.authenticationEntryPoint?=?authenticationEntryPoint;
???}
???@Override
???public?void?onAuthenticationFailure(HttpServletRequest?request,?HttpServletResponse?response,
?????????AuthenticationException?exception)?throws?IOException,?ServletException?{
??????this.authenticationEntryPoint.commence(request,?response,?exception);
???}
}
具體的配置可參考之前的 Spring Security 實(shí)戰(zhàn)干貨:自定義異常處理[3]。
參考資料
[1]RFC 7235: https://tools.ietf.org/html/rfc7235
[2]RFC 7231: https://tools.ietf.org/html/rfc7231
[3]Spring Security 實(shí)戰(zhàn)干貨:自定義異常處理: https://felord.cn/spring-security-exception.html
往期推薦:
請不要再使用判斷進(jìn)行參數(shù)校驗(yàn)了
2020-07-25
Spring Security 實(shí)戰(zhàn)干貨:從零手寫一個驗(yàn)證碼登錄
2020-07-22
Spring Security 實(shí)戰(zhàn)干貨:理解AuthenticationManager
2020-07-21
總結(jié)
以上是生活随笔為你收集整理的springsecurity 登录失败_Spring Security 实战干货: 401和403状态的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手机厂商开始卷内存了!这背后“微信”们得
- 下一篇: gradle idea java ssm