dubbo-token驗證

服務提供者過濾器

import java.util.Map;
import java.util.Objects;/*** @title ProviderTokenFilter* @description 服務提供者 token 驗證* author zzw* version 1.0.0* create 2025/5/7 22:17**/
@Activate(group = CommonConstants.PROVIDER)
public class ProviderTokenFilter implements Filter {/*** token 字段名*/private static final String TOKEN_KEY = "TOKEN";/*** token 驗證是否開啟 字段名*/public static final String KEY_AUTH_ENABLED = "auth.enable";/*** token 值 字段名*/private static final String KEY_AUTH_TOKEN = "auth.token";@Overridepublic Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {// 未開啟 token 驗證時,直接調用方法if (!authEnable(invoker, invocation)) {return invoker.invoke(invocation);}// 獲取請求參數中的 tokenString receiveToken = getTokenFromRequest(invocation);if (Objects.isNull(receiveToken)) {throw new RuntimeException("Receive token is null or empty, path: " +String.join(".", invoker.getInterface().getName(), invocation.getMethodName()));}// 獲取服務提供方配置的 tokenString authToken = getTokenConfig(invoker, invocation);// 判斷入參token和服務提供者配置是否一致if (!receiveToken.equals(authToken)) {throw new RuntimeException("Receive token is invalid, path: " +String.join(".", invoker.getInterface().getName(), invocation.getMethodName()));}// 驗證通過后執行下一個過濾器或者執行最終方法return invoker.invoke(invocation);}/*** 獲取服務提供方配置的token*/private String getTokenConfig(Invoker<?> invoker, Invocation invocation) {return invoker.getUrl().getParameter(KEY_AUTH_TOKEN);}/*** 獲取請求參數中的 token*/private String getTokenFromRequest(Invocation invocation) {Map<String, Object> attachments = invocation.getObjectAttachments();if (null == attachments || Objects.isNull(attachments.get(TOKEN_KEY))) {return null;}return attachments.get(TOKEN_KEY).toString();}/*** 判斷 TOKEN 開關是否開啟** @return true:開啟;false:未開啟*/private boolean authEnable(Invoker<?> invoker, Invocation invocation) {return invoker.getUrl().getParameter(KEY_AUTH_ENABLED, false);}}

服務提供者服務配置

@DubboService(validation = "true", parameters = {"auth.enable:true", "auth.token:123456"})
public class UserServiceImpl implements UserService {@Overridepublic BaseResult<String> registerUser(UserDTO userDTO) {return BaseResult.success("用戶注冊成功:" + userDTO.getUsername());}
}

服務提供者過濾器配置

META-INF/dubbo/org.apache.dubbo.rpc.Filter

providerToken=com.doudou.filter.ProviderTokenFilter

服務消費者過濾器

@Activate(group = CommonConstants.CONSUMER)
public class ConsumerTokeFilter implements Filter {/*** token 字段名*/private static final String TOKEN_KEY = "TOKEN";/*** token 值 字段名*/private static final String KEY_AUTH_TOKEN = "auth.token";@Overridepublic Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {// 獲取服務消費者配置的tokenString authToken = getTokenConfig(invoker, invocation);if (Objects.nonNull(authToken)) {// 如果配置了token,放入到請求對象中invocation.setAttachment(TOKEN_KEY, authToken);}// 執行后續操作return invoker.invoke(invocation);}/*** 獲取消費者提供方配置的token*/private String getTokenConfig(Invoker<?> invoker, Invocation invocation) {return invoker.getUrl().getParameter(KEY_AUTH_TOKEN);}
}

服務消費者配置

@RestController
public class UserServiceController {@DubboReference(validation = "false", parameters = {"auth.token:123456"})private UserService userService;@PostMapping("/test")public BaseResult<String> test(@RequestBody UserDTO userDTO) {return userService.registerUser(userDTO);}
}

服務消費者過濾器配置

META-INF/dubbo/org.apache.dubbo.rpc.Filter

providerToken=com.doudou.filter.ProviderTokenFilter

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

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

相關文章

沃倫森電氣高壓動態無功補償裝置助力企業電能優化

在工業生產的復雜電能環境中&#xff0c;電能質量直接影響企業的生產效率和運營成本。XX光伏科技有限公司作為一家快速發展的制造企業&#xff0c;隨著生產規模的不斷擴大&#xff0c;其內部電網面臨功率因數過低、電壓波動頻繁等問題&#xff0c;導致供電部門罰款增加、設備故…

基于EFISH-SCB-RK3576工控機/SAIL-RK3576核心板的網絡安全防火墻技術方案?(國產化替代J1900的全棧技術解析)

?基于EFISH-SCB-RK3576/SAIL-RK3576的網絡安全防火墻技術方案? &#xff08;國產化替代J1900的全棧技術解析&#xff09; ?一、硬件架構設計? ?流量處理核心模塊? ?多核異構架構?&#xff1a; ?四核Cortex-A72&#xff08;2.3GHz&#xff09;?&#xff1a;處理深度…

Maven 動態版本與SNAPSHOT機制詳解

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家&#xff0c;歷代文學網&#xff08;PC端可以訪問&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移動端可微信小程序搜索“歷代文學”&#xff09;總架構師&#xff0c;15年工作經驗&#xff0c;精通Java編…

趣味編程:答案之書

概述&#xff1a;該篇博客主要介紹的是曾經一度風靡全網的答案之書小程序。 目錄 1. 效果展示 2. 源碼展示 3. 代碼邏輯詳解 3.1 頭文件與全局變量 3.2 main函數 3.3 主循環 3. 4 繪制界面 4. 運行問題 5.小結 1. 效果展示 該小程序是動態的效果&#xff0c; 因此實…

多線程初階(2)

說到多線程編程&#xff0c;一定少不了線程安全這個話題。我們前面了解了線程的原理以及線程與進程的關系。線程之間共享資源&#xff0c;這就代表了在多線程編程中一定會產生沖突&#xff0c;所以我們需要在敲代碼時保證線程安全&#xff0c;避免這樣的問題發生。 我們先看一…

【Ubuntu】安裝向日葵遠程控制

前言 在Ubuntu 24.04.2下安裝向日葵遠程控制出錯&#xff0c;少了一些依賴&#xff0c;需要安裝一些依賴。 1.安裝gconf2-common wget http://mirrors.kernel.org/ubuntu/pool/universe/g/gconf/gconf2-common_3.2.6-6ubuntu1_all.deb sudo dpkg -i gconf2-common_3.2.6-6ub…

【Python開源】深度解析:一款高效音頻封面批量刪除工具的設計與實現

&#x1f3b5; 【Python開源】深度解析&#xff1a;一款高效音頻封面批量刪除工具的設計與實現 &#x1f308; 個人主頁&#xff1a;創客白澤 - CSDN博客 &#x1f525; 系列專欄&#xff1a;&#x1f40d;《Python開源項目實戰》 &#x1f4a1; 熱愛不止于代碼&#xff0c;熱情…

JAVA房屋租售管理系統房屋出租出售平臺房屋銷售房屋租賃房屋交易信息管理源碼

一、源碼描述 這是一套房屋租售管理源碼&#xff0c;基于SpringBootVue框架&#xff0c;后端采用JAVA開發&#xff0c;源碼功能完善&#xff0c;涵蓋了房屋租賃、房屋銷售、房屋交易等業務。 二、源碼截圖

一篇文章講清楚mysql的聚簇索引、非聚簇索引、輔助索引

聚簇索引與非聚簇索引最大的區別就是&#xff1a; 聚簇索引的索引和數據是存放在一起的&#xff0c;都是在葉子結點&#xff1b; 非聚簇索引的索引和數據是分開存儲的&#xff0c;葉子節點存放的是索引和指向數據文件的地址&#xff0c;通過葉子節點找到索引&#xff0c;再通…

使用ESPHome燒錄固件到ESP32-C3并接入HomeAssistant

文章目錄 一、安裝ESPHome二、配置ESP32-C3控制燈1.主配置文件esp32c3-luat.yaml2.基礎通用配置base.yaml3.密碼文件secret.yaml4.圍欄燈four_light.yaml5.彩燈rgb_light.yaml6.左右柱燈left_right_light.yaml 三、安裝固件四、HomeAssistant配置ESPHome1.直接訪問2.配置ESPHom…

什么是變量提升?

變量提升&#xff08;Hoisting&#xff09; 是 JavaScript 引擎在代碼執行前的一個特殊行為&#xff0c;它會將變量聲明和函數聲明自動移動到當前作用域的頂部。但需要注意的是&#xff0c;只有聲明會被提升&#xff0c;賦值操作不會提升。 ??核心概念?? 變量聲明提升&…

【萬字長文】深入淺出 LlamaIndex 和 LangChain:從RAG到智能體,輕松駕馭LLM應用開發

Langchain系列文章目錄 01-玩轉LangChain&#xff1a;從模型調用到Prompt模板與輸出解析的完整指南 02-玩轉 LangChain Memory 模塊&#xff1a;四種記憶類型詳解及應用場景全覆蓋 03-全面掌握 LangChain&#xff1a;從核心鏈條構建到動態任務分配的實戰指南 04-玩轉 LangChai…

2025 后端自學UNIAPP【項目實戰:旅游項目】3、API接口請求封裝,封裝后的簡單測試以及實際使用

一、創建請求封裝目錄 選中自己的項目&#xff0c;右鍵鼠標---->新建---->目錄---->名字自定義【我的是api】 二、創建兩個js封裝文件 選中封裝的目錄&#xff0c;右鍵鼠標---->新建---->js文件---->名字自定義【我的兩個js文件分別是my_http和my_api】 三…

autojs和冰狐智能輔助該怎么選擇?

最近打算做自動化腳本&#xff0c;在autojs和冰狐智能輔助中做選擇&#xff0c;不知道該怎么選。沒辦法只能花費大量時間仔細研究了autojs和冰狐智能輔助&#xff0c;綜合考慮功能需求、開發復雜度、編程經驗及項目規模等因素。以下是兩者的核心對比及選擇建議&#xff0c;僅供…

python24-匿名函數

課程&#xff1a;B站大學 記錄python學習&#xff0c;直到學會基本的爬蟲&#xff0c;使用python搭建接口自動化測試就算學會了&#xff0c;在進階webui自動化&#xff0c;app自動化 匿名函數 匿名函數實踐是檢驗真理的唯一標準 匿名函數 匿名函數是指沒有名字的函數&#xff…

Android 查看 Logcat (可純手機方式 無需電腦)

安裝 Logcat Reader Github Google Play 如果有電腦 使用其ADB方式可執行如下命令 后續無需安裝Termux # 使用 ADB 授予 android.permission.READ_LOGS 權限給 Logcat Reader adb shell "pm grant com.dp.logcatapp android.permission.READ_LOGS && am force-…

驅動開發硬核特訓 · Day 30(上篇):深入理解 I2C 總線驅動模型(以 at24 EEPROM 為例)

作者&#xff1a;嵌入式Jerry 視頻教程請關注 B 站&#xff1a;“嵌入式Jerry” 一、寫在前面 在上一階段我們已經深入理解了字符設備驅動與設備模型之間的結合方式、sysfs 的創建方式以及平臺驅動模型的實際運用。今天我們邁入總線驅動模型的世界&#xff0c;聚焦于 I2C 總線…

超詳細講解注意力機制、自注意力機制、多頭注意力機制、通道注意力機制、空間注意力機制

在如今的機器學習和深度學習領域&#xff0c;注意力機制絕對是一個熱度居高不下的話題。事實上&#xff0c;注意力機制并不是一個全新的概念&#xff0c;早在多年前就已經被提出并應用。比如在圖像分類任務中&#xff0c;SENet 和 ECA-Net 等模型中都運用了注意力機制&#xff…

Wireshark基本使用

本文會對Wireshark做簡單介紹&#xff0c;帶大家熟悉一下Wireshark的界面&#xff0c;以及如何使用過濾器。 接著會帶大家查看TCP五層模型下&#xff0c;帶大家回顧各層首部的格式。 最后會演示 Wireshark 如何抓取三次握手和四次揮手包的過程。 目錄 一.Wireshark簡介 二…

加速項目落地(Trae編輯器)

目錄 vscode安裝python支持 vscode常用插件 Trae編輯器 兩個界面合成 補充&#xff08;QT開發的繁瑣&#xff09; AI編程哪家強&#xff1f;Cursor、Trae深度對比&#xff0c;超詳細&#xff01; - 知乎 Trae兼容vscode的插件&#xff0c;我們可以先在vscode里面裝好再一…