当前位置: 首页 > ds >正文

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.xdnf.cn/news/4513.html

相关文章:

  • 路由器WAN口和LAN口
  • 大数据技术全景解析:Spark、Hadoop、Hive与SQL的协作与实战
  • UE5 Audio2Face导出USD表情与ARKIT表情重定向
  • 嵌入式MCU语音识别算法及实现方案
  • 雨云游戏云MCSM面板服使用教程我的世界Forge服务端开服教程
  • 树上背包学习笔记
  • 小游戏(2)扫雷游戏
  • enum4linux:渗透测试中的Windows信息收割机!全参数详细教程!Kali Linux教程!
  • 探索开源大模型体系:当今AI的引领者
  • MySQL 主从配置超详细教程
  • 如何将C#程序打包成软件绿色包
  • python学习记录
  • 跨境电商合规新时代:亚马逊AHR风控系统深度解析与应对指南
  • Hacker kid: 1.0.1靶场渗透测试
  • 玛格丽特鸡尾酒评鉴,玛格丽特酒的寓意和象征
  • 巧用Ozon价格指数,发挥本土供应链优势提升商品竞争力
  • 商业实战将归巢网内容构建为本地RAG模型的完整指南01-优雅草卓伊凡
  • 使用hybird做接口配置
  • Protobuf的速成之旅
  • 数智管理学(七)
  • RA4M2开发TOF VL53L4CD(1)----轮询获取测距数据
  • 【Trea】Trea国际版|海外版下载
  • MUSIQ ,MANIQA,CLIP-IQA,FID是什么指标,分别是如何计算的(图像恢复领域评价指标
  • MPU6050 六轴姿态 Arduino ESP32 Test
  • 使用pyenv安装Python指南
  • C++ vector 介绍与使用
  • 【Fifty Project - D23】
  • 可视化图解算法33:判断是不是平衡二叉树
  • C++自动重连机制设计与实现指南
  • 融智学核心理论的数学化表达(之二)