一、 需求说明

签名验证是一种技术,用于确保数据完整性和身份验证。在Java应用程序中,签名通常是由开发人员提供的一个字符串,它基于请求的内容和一些密钥信息生成。这个签名可以被认为是一种指纹,它唯一地标识了请求的内容,同时也确保了请求的完整性。在接收到请求后,应用程序会使用相同的密钥信息和相同的算法来生成签名,然后将其与请求中提供的签名进行比较。如果两个签名匹配,则请求被认为是有效的。

这种技术可以有效地防止恶意请求和数据篡改。如果没有签名验证机制,攻击者可能会伪造请求或篡改数据,这可能会导致安全漏洞和数据泄露。因此,请求AppKey签名验证是一种重要的安全机制,它可以帮助开发人员保护他们的应用程序免受未经授权的访问。

二、 软件详细设计

本章节主要介绍软件详细设计过程、主要包含软件结构详细设计、功能流程详细设计、各个模块调用时序图,以及各接口详细设计;

2.1、软件结构详细设计

通用签名校验软件结构如图:1所示

图1:软件结构图
签名验证软件主要包含三大功能:

  • 1、签名切面验证,提供方法注解方式验证请求签名是否正确;
  • 2、认证Filter,提供请求Filter验证请求头签名是否正确;
  • 3、Feign、RestTemplate远程调用自动添加签名请求头;

签名认证一般会包含两个主要功能提供签名校验方法和发送签名请求;

软件从下至上主要分三部分功能:

1、 基础接口层

  • SignValidator:签名参数校验,验证签名参数是否合法,是否缺少签名参数,以及参数签名是否正确;
  • AppKeyGenerator: 给签名工具类使用,用于生成AppKey、AppSecret等。
  • AopLifecycle:在签名校验前后添加自定义业务逻辑,需要根据自己业务确定是否需要覆盖;
  • AppSecretProvider: 传入AppKey获取该AppKey对应的AppSecret,默认采用配置文件方式读取密钥对;可根据自己业务逻辑覆盖;
  • AuthLifecycle: 开启认证拦截器可用过该回调接口处理自己业务逻辑,如签名验证通过后自动映射为当前登录用户的Token;
  • SignAlogrithm:签名算法提供类,根据签名参数计算签名,用于生成

2、 通用功能层

  • SignAop: 通过方法注解的方式添加请求参数签名校验,常用场景如开发某个Controller为对外暴露接口添加@OpenApi注解可对请求的参数进行签名校验;
  • AuthFilter:认证过滤器,提供认证级别的签名校验;业务场景如在系统通过签名方式完成认证,即可通过启用该过滤器完成签名认证;需要根据自己业务逻辑完成认证相关代码;
  • FeignInterceptor:远程调用签名请求头自动添加拦截器,支持Feign和RestTemplate 两种方式使用;

3、 自动注入层

  • EnableAuthFilter:启用认证Filter;
  • EnableFeignInterceptor:启用Feign远程调用请求拦截器;
  • EnableRestTemplateInterceptor: 启用RestTemplate请求签名拦截器;
  • 默认情况加只会注入基础服务类,也就是AOP签名切面及其相关基础服务;AuthFilter、Feign、RestTemplate 相关实体Bean都不会注册;

2.2、功能流程详细设计

本章节详细介绍软件具体工作流程。详细工作时序图如图2所示:

图2: AOP签名校验时序图

AOP切面为最基础的接口签名使用方式,这种方式比较简单也利于理解,但是缺点是不能添加权限控制,需要开发的接口都需要添加@OpenApi 注解;这种模式也是默认启用自动注册到SpringBean容器中的;使用一般需要以下几步:

1、 系统业务拦截器中放行需要签名的接口,一般会采用通用前缀如:/openapi/**

2、 配置或注册AppSecret;默认支持配置方式,通过在yml文件中配置如下配置:

spring:open-api:keys:- appKey: xxxxappSecret: xxx

也可以根据自己业务逻辑自行实现AppSecretProvider接口并将Bean注入到Spring容器中;

3、 签名认证回调接口实现,这一部分需要根据自身业务添加相应的业务代码;如果添加请求TraceId,设置MDC请求上下文等;提供默认实现,根据自身业务需求注册回调Bean;

4、 调用业务逻辑

5、 业务执行完成回调:如清理MDC上下文等;

通常添加了签名接口,一般都会需求请求相关签名接口,请求签名接口需要按照签名规则添加相应的请求头和签名请求头;以下展示Feign请求自动添加签名时序图:

图3 FeignInterceptor调用时序图

虽然这种调用逻辑比较简单,但需要注册图中FeignClient需要单独配置拦截器,及拦截器不能注册成全局拦截器,只需在需要的FeignClient上配置;RestTemplate 与Feign远程调用过程类型,但也需要注意不能使用全局对象,需要使用单独的签名RestTemplate对象;

案例1: AOP方式使用

1.1 接口暴漏

1、在Filter 中 添加放行URL,这里不添加了

2、在Controller 方法中添加注解@OpenApi

    @OpenApi@PostMapping(value = "/open/saveUser")public HttpResponse<Boolean> saveUser(@RequestBody @Validated UserInfo user) {return userService.saveUser(user);}

3、引入Maven依赖(示例):

     <dependency><groupId>com.gxf</groupId><artifactId>common-openapi</artifactId></dependency>

4、添加配置:

# 开放接口 appKey
spring.open-api.keys[0].app-key=8YA26xxxx
spring.open-api.keys[0].app-secret=xxxxx

1.2 Feign远程调用

1、添加配置:

spring.open-api.feign.appKey: xxxx
spring.open-api.feign.appSecret: xxxx

2、启用FeignClient

@Configuration
// 启用该注解则全局Feign调用都会自动添加请求头,(不推荐)
@EnableOpenApiFeignInterceptor
// 注意 如果已经启动则不需要 再次添加该注解
@EnableFeignClients(basePackages = "com.openapi")
public class FeignClientConfig {}

3、如果启用EnableOpenApiFeignInterceptor就不需要如下代码了:

// 自定义配置,注意不能注册到Spring容器中
public class MyFeignClientConfiguration implements FeignClientConfigurer {/*** Feign 远程调用签名验证器** @return 结果*/@Beanpublic FeignSignRequestInterceptor feignSignRequestInterceptor() {return new FeignSignRequestInterceptor();}
}// 使用自定义Feign配置
@FeignClient(name="MyOpenApi", url = "${spring.open-api.url}", configuration = MyFeignClientConfiguration.class)
public interface MyOpenApi {}

通用AppKey签名验证软件相关推荐

  1. 通用职责分配软件原则之4-高内聚原则

    高内聚原则(High Cohesion Principle) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/375 访问 ...

  2. 用c语言如何设计dos界面,DOS界面下通用图形编辑软件的设计

    目前用作DDC的PC总线工控机(IPC)大部分工作在DOS界面上,而DOS不具有像Windows那样美观方便的图形用户接口(GUI).生成工艺流程图等复杂图形若用程序设计语言直接编程需花费大量精力和代 ...

  3. 通用一键打包软件,数据包制作工具

    通用一键打包软件,数据包制作工具 75800630376082712有间茶社

  4. 有什么好用的通用型项目管理软件

    目前市面上的项目管理产品非常丰富,在选择项目管理软件的过程中一一了解这些产品哪个更好更适合自己的团队,无疑会浪费很多时间成本.通用性项目管理工具可以满足大部分团队的项目管理需求,那有什么好用的通用型项 ...

  5. 软件测试用例_通用测试用例执行软件

    INTEWORK-TAE(Testcase Automation Executor , 以下简称TAE) 是一款通用的测试用例执行软件,可以兼容不同的仿真系统,同时具备了故障注入.标定.测量.诊断.模 ...

  6. 通用程序测试软件,得实打印机通用驱动程序系列1

    得实打印机通用驱动程序系列1是一款得实Dascom除DS-9XX.AR-4XX型号外其他系列都能使用的得实打印机通用驱动程序,该驱动是官方通用版本,适用于除DS-9XX.AR-4XX型号外得实所有其他 ...

  7. GRASP通用职责分配软件模式

    1.  概述 它的核心思想是"职责分配(Responsibility Assignment)".GRASP提出了几个基本原则,用来解决面向对象设计的一些问题. Craig Larm ...

  8. 通用职责分配软件原则之7-纯虚构原则

    纯虚构原则(Pure Fabrication Principle) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/381 ...

  9. 通用职责分配软件原则之6-多态原则

    多态原则(Polymorphism Principle) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/379 访问. ...

最新文章

  1. tensorflow-gpu
  2. 地表水预测模型软件_高速列车关键构件疲劳寿命预测软件系统成功开发
  3. Directory lookup for the file xxx.mdf failed with the operating system error 2
  4. windows隐藏python运行时的终端
  5. php+求日期,PHP 日期转换
  6. Go实现Raft第二篇:选举
  7. JQuery1.11版本对prop和attr接口的含义分离导致问题分析
  8. 最通俗易懂的命名实体识别NER模型中的CRF层介绍
  9. jdk中ArrayList的实现
  10. DCL记忆上次输入值lisp_python-输入和输出
  11. 计算机基础---04ppt篇(world转化为ppt,字体设计,形状,ppt背景,音频,视频动画效果,模板推荐,插件推荐)
  12. 国内外优秀公共DNS测评及推荐
  13. 一个神奇的大学科目《软件工程》,知识点总结+测试题,包你不挂科
  14. Windows 10注册表损坏该如何修复?
  15. 前端工程师未来发展方向
  16. 七牛云发送短信验证码
  17. Criteria和DetachedCriteria
  18. Java面试题2019
  19. Nacos学习之初识Nacos
  20. 我与CSDN的2020

热门文章

  1. 将两个有序顺序表合并为一个新的有序顺序表
  2. 如何看懂黄金交易k线图?
  3. 【目标跟踪】MOT数据集GroundTruth可视化
  4. Unity 协程用法总结
  5. 字节字节是计算机的运算速度,【bit or Byte】计算机位和字节透彻理解
  6. offer收割攻略,Web前端面试真题JavaScript系列(带详解)
  7. 浅谈vue项目上线问题
  8. 要,囫囵吞枣; 不要, 咬一口丢下
  9. C语言代码示范与讲解+C语言编程规范及基础语法+编程实战
  10. 电池与电源供电选择的问题