基於spring-security 401 403錯誤自定義處理方案
spring-security 401 403錯誤自定義處理
為瞭返回給前端統一的數據格式,
一般所有的數據都會以類似下面的方式返回:
public class APIResultDto<T> { /** * 狀態碼:-1代表成功,具體參考APIErrorCode類 */ private int er; /** * 狀態描述,可以自行設置或使用APIErrorCode類中默認描述 */ private String erMessage; /** * 實際返回實體,isSuccess()返回true時該字段有效 */ private T items; }
但是一些框架,比如本文要說的spring-security是不按照我們自定義規范處理的,幸運的是spring-security框架給瞭我們可以定制化的地方,隻需繼承
ResourceServerConfigurerAdapter
重寫
public void configure(ResourceServerSecurityConfigurer resources) throws Exception
方法即可,在裡面添加自定義的針對授權時返回的401以及403錯誤碼,
具體如下:
@Autowired private AccessDeniedHandler accessDeniedHandler; @Autowired private AuthenticationEntryPoint authenticationEntryPoint; @Override public void configure(ResourceServerSecurityConfigurer resources) { resources.authenticationEntryPoint(authenticationEntryPoint); resources.accessDeniedHandler(accessDeniedHandler); }
裡面涉及到的AccessDeniedHandler以及AuthenticationEntryPoint
如下所示:
@Component public class CustomizedAuthenticationEntryPoint implements AuthenticationEntryPoint { @Override public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { response.setContentType("application/json;charset=UTF-8"); //按照系統自定義結構返回授權失敗 response.getWriter().write(JSON.toJSONString(APIResultDto.failed(APIErrorCode.AUTH_FAILED))); } } @Component public class CustomAccessDeniedHandler implements AccessDeniedHandler { @Override public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException { response.setContentType("application/json;charset=UTF-8"); //按照系統自定義結構返回授權失敗 response.getWriter().write(JSON.toJSONString(APIResultDto.failed(APIErrorCode.AUTH_FAILED))); } }
關於狀態碼401與403區別
401 表示用戶沒有權限(令牌,用戶名,密碼錯誤)
403 表示用戶有權限,隻是訪問是被禁止的(可以理解為,用戶有權限,但是某些目錄禁止訪問)
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- 解決Spring Security中AuthenticationEntryPoint不生效相關問題
- 詳解spring cloud ouath2中的資源服務器
- SpringBoot Security的自定義異常處理
- Spring security如何重寫Filter實現json登錄
- Spring Boot 2結合Spring security + JWT實現微信小程序登錄