通過SpringCloudGateway中的GlobalFilter實現鑒權過濾

1.pom.xml中加入gateway jar包

    <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>

2.創建權限過濾器?SecurityFilter

/*** 鑒權過濾***/
@Slf4j
@Component
public class SecurityFilter implements GlobalFilter, Ordered {@Resourceprivate MerchantAppApi merchantAppApi;/*** 簽名算法*/private final static String SIGN_RULE = "HmacSHA256";/*** 通過sdkKey做鑒權過濾***/@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 獲取頭信息HttpHeaders headers = exchange.getRequest().getHeaders();// 頭信息 客戶端簽名String sign = headers.getFirst("sign");// 頭信息 客戶端timeStampString timeStamp = headers.getFirst("timeStamp");// 頭信息 賬戶keyString sdkKey = headers.getFirst("sdkKey");//獲取body strString bodyStr = RequestBodyUtil.resolveBodyFromRequest(exchange.getRequest());// 去空格bodyStr = StringUtils.replace(bodyStr, " ", "");String authDesc = "鑒權異常..";try {// rpc 賬戶信息GetMerchantAppResp merchantApp = merchantAppApi.getMerchantApp(new MerchantAppReq().setSdkKey(sdkKey)).getData();if (merchantApp == null) {authDesc = "賬戶不存在..";throw new IllegalAccessException("賬戶不存在..");}if (!merchantApp.getStatus()) {authDesc = "賬戶被禁用..";throw new IllegalAccessException("賬戶被禁用..");}// 驗證簽名String signStr = SecurityFilter.genSign(timeStamp, sdkKey, merchantApp.getSdkSecret(), bodyStr);if (!StringUtils.equals(sign, signStr)) {authDesc = "簽名驗證失敗..";throw new IllegalAccessException("簽名驗證失敗..");}} catch (Exception e) {log.error(String.format("=== %s ===, timeStampStr=%s, sdkKey=%s, requestBody=%s",authDesc, timeStamp, sdkKey, bodyStr), e);ServerHttpResponse response = exchange.getResponse();ApiResp apiResp = ApiResp.authFail(authDesc);byte[] bits = JacksonUtil.toJsonString(apiResp).getBytes(StandardCharsets.UTF_8);DataBuffer buffer = response.bufferFactory().wrap(bits);// 200response.setStatusCode(HttpStatus.OK);//指定編碼,否則在瀏覽器中會中文亂碼response.getHeaders().add("Content-Type", "application/json;charset=UTF-8");return response.writeWith(Mono.just(buffer));}return chain.filter(exchange);}/*** 根據請求時間戳 以及請求body 生產簽名** @param timeStamp 時間戳* @param bodyStr   實體類* @return 簽名*/private static String genSign(String timeStamp, String sdkKey, String sdkSecret, String bodyStr) {String sign = "";try {String signResource = timeStamp + sdkKey + bodyStr;Mac mac = Mac.getInstance(SIGN_RULE);mac.init(new SecretKeySpec(sdkSecret.getBytes(StandardCharsets.UTF_8), SIGN_RULE));byte[] signatureBytes = mac.doFinal(signResource.getBytes(StandardCharsets.UTF_8));String hexStr = Hex.encodeHexString(signatureBytes);sign = Base64.encodeBase64String(hexStr.getBytes());} catch (Exception e) {log.error("=== 生成簽名失敗 ===, timeStampStr={}, sdkKey={}, sdkSecret={}, requestBody={}", timeStamp, sdkKey, sdkSecret, bodyStr);}return sign;}/*** 過濾順序** @return 排序*/@Overridepublic int getOrder() {return 5;}}

3.封裝工具類 RequestBodyUtil

/*** 操作request body的工具**/
public class RequestBodyUtil {private final  static  Pattern P = Pattern.compile("\\s*|\t|\r|\n");/*** 讀取body內容** @param serverHttpRequest 請求對象* @return body*/public static String resolveBodyFromRequest(ServerHttpRequest serverHttpRequest) {//獲取請求體Flux<DataBuffer> body = serverHttpRequest.getBody();StringBuilder sb = new StringBuilder();body.subscribe(buffer -> {byte[] bytes = new byte[buffer.readableByteCount()];buffer.read(bytes);String bodyString = new String(bytes, StandardCharsets.UTF_8);sb.append(bodyString);});return formatStr(sb.toString());}/*** 去掉空格,換行和制表符** @param str 待優化字符串* @return 格式化后的str*/private static String formatStr(String str) {if (str != null && str.length() > 0) {Matcher m = P.matcher(str);return m.replaceAll("");}return str;}}

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

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

相關文章

第 11 章 排序

第 11 章 排序 Abstract 排序猶如一把將混亂變為秩序的魔法鑰匙&#xff0c;使我們能以更高效的方式理解與處理數據。 無論是簡單的升序&#xff0c;還是復雜的分類排列&#xff0c;排序都向我們展示了數據的和諧美感。 本章內容 11.1 排序算法11.2 選擇排序11.3 冒…

Ps:調整畫筆工具

調整畫筆工具 Adjustment Brush Tool可以將選區、創建蒙版和應用調整的傳統工作流程合并為一個步驟&#xff0c;簡化了對圖像進行非破壞性局部調整的操作。 快捷鍵&#xff1a;B 調整畫筆工具是 Photoshop 2024 年 5 月版&#xff08;25.9 版&#xff09;新增的工具。 ◆ ◆ …

【STM32】定時器與PWM的LED控制

目錄 一、定時器控制LED周期性亮滅&#xff08;一&#xff09;定時器1.STM32F103定時器分類及區別2.通用定時器主要功能3.通用定時器工作過程 &#xff08;二&#xff09;STM32CubeMX創建工程&#xff08;三&#xff09;代碼實現&#xff08;四&#xff09;實驗結果 二、PWM模式…

gin接收圖片文件,websocet持續返回響應,解決多任務排隊問題

背景 有一個需求是這樣的&#xff0c;前端需要通過http請求的form-data上傳圖片文件&#xff0c;后端接收圖片后調用AI接口執行命令&#xff0c;由于命令執行時間較長&#xff0c;需要持續返回當前任務在全局任務列表中的位置&#xff0c;以便前端即時更新排隊信息。 思考 如…

【源碼】Spring Data JPA原理解析之Repository自定義方法命名規則執行原理(二)

Spring Data JPA系列 1、SpringBoot集成JPA及基本使用 2、Spring Data JPA Criteria查詢、部分字段查詢 3、Spring Data JPA數據批量插入、批量更新真的用對了嗎 4、Spring Data JPA的一對一、LazyInitializationException異常、一對多、多對多操作 5、Spring Data JPA自定…

Oracle中TAF與SCANIP全面解析

TAF (Transparent Application Failover) 概念&#xff1a; TAF是Oracle數據庫提供的一個高級特性&#xff0c;旨在實現應用程序在數據庫連接中斷時的透明重連。它允許應用程序在數據庫故障發生時&#xff0c;無需修改代碼或手動干預&#xff0c;就能自動連接到新的數據庫實例…

Java垃圾回收_1

一、垃圾回收 1.如何判斷對象可以回收 &#xff08;1&#xff09;引用計數法 存在循環引用問題&#xff0c; Java未使用這種算法 在引用計數法中&#xff0c;每個對象都有一個引用計數器&#xff0c;記錄著指向該對象的引用數量。當引用計數器為零時&#xff0c;表示沒有任…

JavaSE:SE知識整體總結

1、引言 歷時一個多月的學習&#xff0c;已經掌握了JavaSE的知識&#xff0c;這篇博客就來做一下SE知識的總結~ 2、數據類型和變量 Java中的數據類型分為基本數據類型和引用數據類型。 2.1 基本數據類型 基本數據類型共有四類八種&#xff1a; 四類&#xff1a;整形、浮點…

在phpstorm2024版里如何使用Jetbrains ai assistant 插件 ?

ai assistant激活成功后&#xff0c;如圖 ai assistant渠道&#xff1a;https://web.52shizhan.cn/activity/ai-assistant 在去年五月份的 Google I/O 2023 上&#xff0c;Google 為 Android Studio 推出了 Studio Bot 功能&#xff0c;使用了谷歌編碼基礎模型 Codey,Codey 是…

SpringBoot HelloWorld 之 實現注冊功能

SpringBoot HelloWorld 之 實現注冊功能 一.配置 創建數據庫big_event CREATE TABLE user (id int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT ID,username varchar(20) COLLATE utf8_unicode_ci NOT NULL COMMENT 用戶名,password varchar(32) COLLATE utf8_unicode_ci …

Vue3項目練習詳細步驟(第五部分:用戶模塊的功能)

頂部導航欄個人信息顯示 接口文檔 接口請求與綁定 導航欄下拉菜單功能 路由實現 退出登錄和路由跳轉實現 基本資料修改 頁面結構 接口文檔 接口請求與綁定 修改頭像 頁面結構 頭像回顯 頭像上傳 接口文檔 重置密碼 頁面結構 接口文檔 接口請求與綁定 頂部導航…

自然語言處理學習路線

學習目標 NLP 系統知識&#xff08;從入門到入土&#xff09; 學習內容 NLP的基本流程&#xff1a;&#xff08;待更&#xff09;文本預處理&#xff08;標點符號處理、繁體轉簡體、分詞Tokenizer&#xff09;&#xff1a;&#xff08;待更&#xff09;詞袋模型&#xff08;TF…

【T+】暢捷通T+軟件固定資產模塊反啟用

【問題描述】 暢捷通T軟件&#xff0c;固定資產模塊反啟用。 【解決方法】 針對賬套庫執行如下腳本清除資產的所有數據&#xff0c; 執行前請與客戶確認資產的所有數據都不要了&#xff0c;確認后備份賬套再執行腳本&#xff0c;切記&#xff01;&#xff01;&#xff01; 然后…

Flutter 中的 ChipTheme 小部件:全面指南

Flutter 中的 ChipTheme 小部件&#xff1a;全面指南 Flutter 是一個由 Google 開發的跨平臺 UI 框架&#xff0c;它提供了一套豐富的組件集合&#xff0c;用于構建現代化的、響應式的移動和 Web 應用。ChipTheme 是 Flutter 中一個專門用于統一設置應用中所有 Chip 組件樣式的…

紅外熱成像觀驅一體儀,夜間驅鳥新利器

夜間驅鳥是機場鳥防工作的重點和難點&#xff0c;但紅外熱成像觀驅一體儀的出現解決了這個問題&#xff0c;它結合了紅外熱成像技術和激光驅鳥技術&#xff0c;極大地提升了夜間驅鳥工作的效率和安全性。 驅鳥技術詳解&#xff1a; 在夜晚低能見度的環境下&#xff0c;紅外熱成…

基于開源項目ESP32 SVPWM驅動無刷電機開環速度測試

基于開源項目ESP32 SVPWM驅動無刷電機開環速度測試 ?本篇硬件電路和代碼來源于此開源項目&#xff1a;https://github.com/MengYang-x/STM3F401-FOC/tree/main&#x1f4cd;硬件電路和項目介紹&#xff0c;立創開源廣場&#xff1a;https://oshwhub.com/shadow27/tai-yang-nen…

【bug】在 Windows 上安裝 SDKMAN! 的完整指南

在 Windows 系統上&#xff0c;安裝 SDKMAN! 可能會遇到一些小問題。本文將詳細介紹如何解決這些問題并成功安裝 SDKMAN!。 問題描述 當在 PowerShell 中運行以下命令以安裝 SDKMAN! 時&#xff1a; curl -s get.sdkman.io | bash你可能會遇到以下錯誤&#xff1a; bash : …

前端面試題日常練-day45 【面試題】

題目 希望這些選擇題能夠幫助您進行前端面試的準備&#xff0c;答案在文末 1. 在Bootstrap中&#xff0c;以下哪個類用于創建一個具有響應式的導航欄&#xff1f; a) .navbar-responsive b) .responsive-nav c) .navbar-collapse d) .collapse-navbar 2. 哪個Bootstrap類用…

2024 HN CTF WebMisc 部分 wp

Web ez_tp 判斷是thinkphp 3.2 參考官方手冊:https://www.kancloud.cn/manual/thinkphp/1697 判斷路由模式 URL_CASE_INSENSITIVE > true, // 默認false 表示URL區分大小寫 true則表示不區分大小寫URL_MODEL > 1, // URL訪問模式,可選參數0、1、…

Python使用動態代理的多元應用

Python作為一種功能強大且易于學習的編程語言&#xff0c;在網絡編程領域具有廣泛的應用。當Python與動態代理技術結合時&#xff0c;便開啟了一扇通往更多可能性的大門。以下將深入探討Python使用動態代理可以實現的多種應用。 首先&#xff0c;Python結合動態代理在網絡爬蟲…