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