【springmvc系】利用RequestBodyAdviceAdapter做接口鑒權

需求

有個簡單的需求,對于第三方接口我們需要做個簡單的鑒權機制,這邊使用的是非對稱性加密的機制。我們提供三方公鑰,他們通過公鑰對接口json報文使用加密后的報文請求,我們通過對接收過來的請求某一個加密報文字段來進行RSA解密校驗

考慮到日后方便其他接口使用,我這邊使用了攔截自定義注解+RequestBodyAdvice機制來處理。話不多說,來實操一把

定義自定義注解類

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AuthenticationThird{}

RAS工具類

pom文件引入依賴

      <dependency><groupId>com.github.shalousun</groupId><artifactId>common-util</artifactId><version>1.9.2</version></dependency>
import com.power.common.util.RSAUtil;import java.util.Map;public class RSATool {/*** 隨機生成一對公私鑰*/public static Map<String, String> generatorRsaPariKey() {return RSAUtil.createKeys(1024);}/*** 通過公鑰來加密獲取對應base64字符串** @param sourceData* @param publicKey* @return*/public static String encryptStr(String sourceData, String publicKey) {return RSAUtil.encryptString(sourceData, publicKey);}/*** 通過RAS 公鑰加密的字符串 使用私鑰來解密** @param encryptStr* @param privateKey* @return*/public static String decryptStr(String encryptStr, String privateKey) {return RSAUtil.decryptString(encryptStr, privateKey);}}

私鑰配置類

@Configuration
@Data
public class ThridApiInfoConfig {@Value("${api.auth.privateKey}")public String authenticationThirdPrivateKey;
}

?第三方請求加密后封裝報文類

@Data
public class BaseEncryptReq {private String encryptBoyStr;private String reqSource;}

自定義異常類

@Setter
@Getter
public class  NoPassException extends RuntimeException {private String message;public NoPassException(String message) {this.message = message;}}

RequestBodyAdvice這里類能干什么

對@RequestBody進行增強處理,比如所有請求的數據都加密之后放在 body 中,在到達 controller 的方法之前,需要先進行解密,那么就可以通過 RequestBodyAdvice 來進行統一的解密處理,無需在 controller 方法中去做這些通用的操作。

自定義的類需要實現 RequestBodyAdvice 接口,但是這個接口有個默認的實現類 RequestBodyAdviceAdapter,相當于一個適配器,方法體都是空的,所以我們自定義的類可以直接繼承這個類,更方便一些

繼承RequestBodyAdviceAdapter類

@Slf4j
@ControllerAdvice
public class DecryptRequestBodyAdvice extends RequestBodyAdviceAdapter {@Autowiredprivate ThridApiInfoConfig thridApiInfoConfig;@Overridepublic boolean supports(MethodParameter methodParameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {return methodParameter.getMethod().isAnnotationPresent(AuthenticationThird.class);}@Overridepublic HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {String encoding = "UTF-8";InputStream inputStream = null;try {//step1 獲取http請求中原始的bodyString body = IOUtils.toString(inputMessage.getBody(), encoding);//step2 將對應字符串轉為beanBaseEncryptReq baseEncryptReq = JSON.parseObject(body, BaseEncryptReq.class);if (!StringUtil.isNotBlank(baseEncryptReq.getEncryptBoyStr())) {throw new NoPassException("接口加密報文不能為空");}if (!StringUtil.isNotBlank(baseEncryptReq.getReqSource())) {throw new NoPassException("接口請求來源參數不能為空");}//todo 判斷來源if (StringUtil.isNotBlank(baseEncryptReq.getReqSource()) && !"xxx".equals(baseEncryptReq.getReqSource())) {throw new NoPassException("接口請求來源參數不合法");}//step3 解密baseEncryptReq.encryptBoyStr屬性,進行RSATool解密String decryptBody = RSATool.decryptStr(baseEncryptReq.getEncryptBoyStr(), thridApiInfoConfig.getAuthenticationThirdPrivateKey());//step 4 將解密之后的body數據重新封裝為HttpInputMessage作為當前方法的返回值inputStream = IOUtils.toInputStream(decryptBody, encoding);} catch (NoPassException ex) {log.error("DecryptRequestBodyAdvice 處理解密異常");throw new NoPassException(ex.getMessage());} catch (Exception ex) {log.error("DecryptRequestBodyAdvice 處理解密異常");throw new NoPassException("接口解密異常");}InputStream finalInputStream = inputStream;return new HttpInputMessage() {@Overridepublic InputStream getBody() throws IOException {return finalInputStream;}@Overridepublic HttpHeaders getHeaders() {return inputMessage.getHeaders();}};}}

?定義測試controller類

@Slf4j
@RestController
@RequestMapping("/testController")
public class TestController {@AuthenticationThird@PostMapping(value="/testAuth")public ResultDto testAuth(@RequestBody String param){log.info("解密后的報文:{}",param);return ResultDto.builder().success(true).message("測試鑒權").build();}
}

定義全局異常處理類

@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {/*** 處理 NoPassException 異常** @param e* @return*/@ExceptionHandler(NoPassException.class)@ResponseBodypublic ResultDto handleNoPassException(NoPassException e) {log.error("自定義NoPassException異常:{},{}", e.getMessage(), e);return  ResultDto.builder().success(false).message(e.getMessage()).build();}

接口響應實體類

@Data
public class ResultDto {private Boolean success;private String  message;
}

測試效果

我們先用之前的RSATool工具類對報文通過公鑰來加密

?控制臺輸出

?

?修改下加密報文

?至此就完成了一個簡單通用的接口鑒權

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/38791.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/38791.shtml
英文地址,請注明出處:http://en.pswp.cn/news/38791.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

婚戀交友h5多端小程序開源版開發

婚戀交友h5多端小程序開源版開發 以下是婚戀交友H5多端小程序的功能列表&#xff1a; 用戶注冊和登錄&#xff1a;用戶可以通過手機號碼或第三方賬號注冊和登錄。個人信息填寫&#xff1a;用戶可以填寫個人基本信息&#xff0c;包括姓名、性別、年齡、身高、體重、學歷、職業等…

Java課題筆記~ 數據提交的方式

前四種數據注入的方式&#xff0c;會自動進行類型轉換。但無法自動轉換日期類型。 &#xff08;1&#xff09;單個數據&#xff08;基本數據類型&#xff09;注入 在方法中聲明一個和表單提交的參數名稱相同的參數&#xff0c;由框架按照名稱直接注入。 &#xff08;2&#x…

微信小程序nfc指令異常記錄

小程序nfc相關代碼: readEvent(){wx.getNFCAdapter().startDiscovery({success:(res)>{console.log(--------------start--------)console.log(res);wx.getNFCAdapter().onDiscovered(callback>{console.log(------------onDiscovered----------)console.log(callback)…

問題:【IntelliJ IDEA】解決idea自動聲明變量加finall修飾符問題

問題:【IntelliJ IDEA】解決idea自動聲明變量加finall修飾符問題 場景復現 1 new String() 2 快捷方式生成變量 final修飾的 final String s new String();步驟一&#xff1a;確保settings配置信息 settings-----》Editor------》Code Style--------》java下的這兩個選項不…

echarts 柱狀圖-折線圖-餅圖的基礎使用

上圖示例圖表展示相關配置&#xff1a; var myChart echarts.init(this.$refs.firstMain);myChart.setOption({legend: { // 圖例設置top: "15%",type: "scroll",orient: "vertical",//圖例列表的布局朝向。left: "right",pageIconCo…

安全加密框架圖——Oracle安全開發者

Oracle安全開發者 ACLs 設計 ACLs&#xff08;訪問控制列表&#xff09;時&#xff0c;可以根據以下思路進行設計&#xff1a; 所有者文件權限&#xff1a;確定文件的所有者能夠對文件執行哪些操作&#xff0c;如讀取、寫入、執行等。這可以根據文件的性質和擁有者的職責來決…

k8s集群部署vmalert和prometheusalert實現釘釘告警

先決條件 安裝以下軟件包&#xff1a;git, kubectl, helm, helm-docs&#xff0c;請參閱本教程。 1、安裝 helm wget https://xxx-xx.oss-cn-xxx.aliyuncs.com/helm-v3.8.1-linux-amd64.tar.gz tar xvzf helm-v3.8.1-linux-amd64.tar.gz mv linux-amd64/helm /usr/local/bin…

12 注冊登錄

12 注冊登錄 整體概述 使用數據庫連接池實現服務器訪問數據庫的功能&#xff0c;使用POST請求完成注冊和登錄的校驗工作。 本文內容 介紹同步實現注冊登錄功能&#xff0c;具體涉及到流程圖、載入數據庫表、提取用戶名和密碼、注冊登錄流程與頁面跳轉的代碼實現。 流程圖&a…

六、Linux系統下,文件操作命令都有哪些?

總括&#xff1a; 創建文件/文件夾&#xff1a;touch&#xff1b; 查看&#xff1a;cat/more&#xff1b; 復制&#xff1a;copy&#xff1b; 移動文件/文件夾&#xff1a;mv&#xff1b; 刪除&#xff1a;rm&#xff1b; 1、創建文件 &#xff08;1&#xff09;語法&#x…

docker私有倉庫

# 有個遠程倉庫 &#xff0c;docker官方提供的 ---》我們可以把我們的鏡像傳上去 # 公司做的鏡像&#xff0c;一般不放在遠程倉庫&#xff0c;公司會自己搭建私有倉庫&#xff08;把公司制作的鏡像傳到私有倉庫&#xff09; 1.鏡像傳到官方倉庫 # 第0步&#xff1a;在遠端創建…

阿里云與中國中醫科學院合作,推動中醫藥行業數字化和智能化發展

據相關媒體消息&#xff0c;阿里云與中國中醫科學院的合作旨在推動中醫藥行業的數字化和智能化發展。隨著互聯網的進步和相關政策的支持&#xff0c;中醫藥產業受到了國家的高度關注。這次合作將以“互聯網 中醫藥”為載體&#xff0c;致力于推進中醫藥文化的傳承和創新發展。…

AIGC繪畫:基于Stable Diffusion進行AI繪圖

文章目錄 AIGC深度學習模型繪畫系統stable diffusion簡介stable diffusion應用現狀在線網站云端部署本地部署Stable Diffusion AIGC深度學習模型繪畫系統 stable diffusion簡介 Stable Diffusion是2022年發布的深度學習文本到圖像生成模型&#xff0c;它主要用于根據文本的描述…

UG NX二次開發(C++)-UI Styler中選擇組件或者實體后設置為工作組件

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 1、前言2、在NX2007中創建一個裝配體實例2.1 裝配體模型2.2 欲實現的功能3、創建對話框文件4、在VS2022中創建一個工程項目4.1 創建項目4.1 在hpp中添加頭文件4.2 在cpp中添加代碼4.3 生成dll5、測…

通俗講解-動量梯度下降法原理與代碼實例

本站原創文章&#xff0c;轉載請說明來自《老餅講解-BP神經網絡》bp.bbbdata.com 目錄 一.動量梯度下降法介紹 1.1 動量梯度下降法簡介與思想 1.2 動量梯度下降法的算法流程 二.動量梯度下降法代碼實例 2.1 動量梯度下降法實例代碼 一.動量梯度下降法介紹…

2023年上半年數學建模競賽題目匯總與難度分析

2023年上半年數學建模競賽題目匯總與難度分析 ?由于近年來國賽ABC題出題方式漂浮不定&#xff0c;沒有太大的定性&#xff0c;目前總體的命題方向為&#xff0c;由之前的單一模型問題變為數據分析評價優化或者預測類題目是B、C題的主要命題方向。為了更好地把握今年命題的主方…

vue3-vuex

一、概念 &#xff08;1&#xff09;Vuex 是一個狀態和數據管理的框架&#xff0c;負責管理項目中多個組件和多個頁面共享的數據。 &#xff08;2&#xff09;在開發項目的時候&#xff0c;我們就會把數據分成兩個部分&#xff0c;一種數據是在某個組件內部使用&#xff0c;我…

【C++】STL案例1-評委打分

0.前言 1.系統自動生成的評委評分代碼&#xff1a; #include <iostream> using namespace std; #include <deque> #include <vector> #include <algorithm> #include <string>//選手類 class Player { public:Player(string name, float score)…

機器學習深度學習——機器翻譯(序列生成策略)

&#x1f468;?&#x1f393;作者簡介&#xff1a;一位即將上大四&#xff0c;正專攻機器學習的保研er &#x1f30c;上期文章&#xff1a;機器學習&&深度學習——seq2seq實現機器翻譯&#xff08;詳細實現與原理推導&#xff09; &#x1f4da;訂閱專欄&#xff1a;機…

ClickHouse常見的DDL語句

1.創建庫 CREATE DATABASE IF NOT EXISTS mytestdb; 2.創建表 CREATE TABLE user_info ( user_id UInt32 comment 用戶標識, name String comment 用戶名, create_date DateTime DEFAULT now() comment 創建時間, sex Enum8(男 1, 女 2) comment 性別, …

最新AI系統ChatGPT網站程序源碼+搭建教程/公眾號/H5端/安裝配置教程/完整知識庫

1、前言 SparkAi系統是基于國外很火的ChatGPT進行開發的Ai智能問答系統。本期針對源碼系統整體測試下來非常完美&#xff0c;可以說SparkAi是目前國內一款的ChatGPT對接OpenAI軟件系統。 那么如何搭建部署AI創作ChatGPT&#xff1f;小編這里寫一個詳細圖文教程吧&#xff01;…