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

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.dtcms.com/a/175587.html

相关文章:

  • 大数据应用开发和项目实战-电商双11美妆数据分析2
  • 《数据结构:二叉搜索树(Binary Search Tree)》
  • 面向智能体开发的声明式语言:可行性分析与未来图景
  • SafeDrive:大语言模型实现自动驾驶汽车知识驱动和数据驱动的风险-敏感决策——论文阅读
  • 【论文阅读】Reconstructive Neuron Pruning for Backdoor Defense
  • 内网渗透技术全面指南——安全业务视角(基于《内网渗透技术 (吴丽进、苗春雨 主编;郑州、雷珊珊、王伦 副主编)》)
  • C++ set和map系列(关联式容器)的介绍及使用
  • 【论文阅读】Towards Stable Backdoor Purification through Feature Shift Tuning
  • Web 架构之负载均衡全解析
  • 【论文阅读】HunyuanVideo: A Systematic Framework For Large Video Generative Models
  • LangChain4j简介
  • 记录一个rabbitmq因为linux主机名服务无法启动的问题
  • UE5.3 C++ 如何在c++ 中拿到UI元素,并绑定不同事件响应功能
  • C++回调函数学习
  • Linux:进程控制1
  • 标量/向量/矩阵/张量/范数详解及其在机器学习中的应用
  • 第8章-1 查询性能优化-优化数据访问
  • 构建安全的机器学习推理API:基于FastAPI的用户认证与管理实战
  • 用R语言+随机森林玩转遥感空间预测-基于R语言机器学习遥感数据处理与模型空间预测技术及实际项目案例分析
  • AI工场全面激活电商创意链
  • 配置Hadoop集群-测试使用
  • 拆解 Prompt 工程:五大场景驱动 DeepSeek 超越 ChatGPT
  • Eclipse 插件开发 5 编辑器
  • 【优化策略】离散化
  • 项目改 pnpm 并使用 Monorepo 发布至 npm 上
  • Python----神经网络(《Going deeper with convolutions》论文解读和GoogLeNet网络)
  • gitignore的相关用法
  • 51单片机快速成长路径
  • Spring MVC中Controller是如何把数据传递给View的?
  • 2025ISCC练武校级赛部分题解WP