基於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。

推薦閱讀: