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