基于spring-security 401 403錯誤自定義處理方案
spring-security 401 403錯誤自定義處理
為了返回給前端統(tǒng)一的數(shù)據(jù)格式,
一般所有的數(shù)據(jù)都會以類似下面的方式返回:
public class APIResultDto<T> {
/**
* 狀態(tài)碼:-1代表成功,具體參考APIErrorCode類
*/
private int er;
/**
* 狀態(tài)描述,可以自行設置或使用APIErrorCode類中默認描述
*/
private String erMessage;
/**
* 實際返回實體,isSuccess()返回true時該字段有效
*/
private T items;
}
但是一些框架,比如本文要說的spring-security是不按照我們自定義規(guī)范處理的,幸運的是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");
//按照系統(tǒng)自定義結構返回授權失敗
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");
//按照系統(tǒng)自定義結構返回授權失敗
response.getWriter().write(JSON.toJSONString(APIResultDto.failed(APIErrorCode.AUTH_FAILED)));
}
}
關于狀態(tài)碼401與403區(qū)別
401 表示用戶沒有權限(令牌,用戶名,密碼錯誤)
403 表示用戶有權限,只是訪問是被禁止的(可以理解為,用戶有權限,但是某些目錄禁止訪問)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
解決spring-boot2.0.6中webflux無法獲得請求IP的問題
這幾天在用 spring-boot 2 的 webflux 重構一個工程,寫到了一個需要獲得客戶端請求 IP 的地方,在寫的過程中遇到很多問題,下面小編通過一段代碼給大家介紹解決spring-boot2.0.6中webflux無法獲得請求IP的問題,感興趣的朋友跟隨小編一起看看吧2018-10-10
application.yml文件中如何開啟mybatis自動駝峰映射
這篇文章主要介紹了application.yml文件中開啟mybatis自動駝峰映射的方法,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08
SpringCloud使用Kafka Streams實現(xiàn)實時數(shù)據(jù)處理
使用Kafka Streams在Spring Cloud中實現(xiàn)實時數(shù)據(jù)處理可以幫助我們構建可擴展、高性能的實時數(shù)據(jù)處理應用,Kafka Streams是一個基于Kafka的流處理庫,本文介紹了如何在SpringCloud中使用Kafka Streams實現(xiàn)實時數(shù)據(jù)處理,需要的朋友可以參考下2024-07-07
IntelliJ IDEA打開多個Maven的module且相互調(diào)用代碼的方法
這篇文章主要介紹了IntelliJ IDEA打開多個Maven的module且相互調(diào)用代碼的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-02-02
Mybatis配置之<environments>配置元素詳解
這篇文章主要介紹了Mybatis配置之<environments>配置元素,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01
Spring Boot集成教程之異步調(diào)用Async
在項目中,當訪問其他人的接口較慢或者做耗時任務時,不想程序一直卡在耗時任務上,想程序能夠并行執(zhí)行,我們可以使用多線程來并行的處理任務,也可以使用spring提供的異步處理方式@Async。需要的朋友們下面來一起看看吧。2018-03-03

