通用AppKey签名验证软件

news2024/12/26 2:13:50

一、 需求说明

签名验证是一种技术,用于确保数据完整性和身份验证。在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: xxxx
        appSecret: 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 结果
     */
    @Bean
    public FeignSignRequestInterceptor feignSignRequestInterceptor() {
        return new FeignSignRequestInterceptor();
    }
}

// 使用自定义Feign配置
@FeignClient(name="MyOpenApi", url = "${spring.open-api.url}", configuration = MyFeignClientConfiguration.class)
public interface MyOpenApi {

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/593257.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

BLECommonTool通用测试工具介绍

工具下载地址&#xff1a;BLECommonTool通用工具资源-CSDN文库 大家在使用过程中&#xff0c;如有发现bug或有更好的建议&#xff0c;欢迎留言或发我QQ邮箱&#xff1a;1255033066qq.com. 工具界面 以下是关于GMBLETool工具的详细使用说明&#xff1a; 蓝牙适配器状态检测&…

springcloudAlibaba整合knife4j整合swagger整合gateway,并且同步到Yapi上

springcloudAlibaba整合knife4j整合swagger整合gateway&#xff0c;并且同步到Yapi上 1.gateway模块 1.pom引入 <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version&g…

什么是七专,电子元器件分级详细总结

🏡《电子元器件高级指南》 目录 0,概述1,商业级元器件2,工业级元器件3,汽车工业级元器件4,七专级元器件5,军级元器件6,航天级元器件0,概述 随着科学技术的发展,以及集成电路技术的不断进步。电子元器件的应用越来越广泛。在不同的应用场景下,往往需要不同等级的电子…

(双指针 ) 15. 三数之和 ——【Leetcode每日一题】

❓15. 三数之和 难度&#xff1a;中等 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a…

pip安装python库速度慢、失败及超时报错解决办法

背景&#xff1a; 随着人工智能的不断兴起&#xff0c;python作为最接近人工智能的语言&#xff0c;变得越来越流行&#xff0c;人生苦短&#xff0c;python要学起来。之所以越来用的人喜欢学习python和研究Python&#xff0c;除了python本身便于学些、语法简短、面向对象等特点…

静态库与动态库的区别

静态库与动态库的区别 静态库动态库 首先用OpenCV的开源库来举个例子了解一下库文件的分类&#xff1a; bin文件夹里面放的都是dll文件&#xff1b; lib文件夹里面放的都是伴随dll文件的动态lib文件&#xff1b; staticlib文件夹里面放的才是真正的静态lib文件&#xff0c;和…

专利费减备案操作流程——让你申请专利时的官费大大打折

【系列专栏】&#xff1a;博主结合工作实践输出的&#xff0c;解决实际问题的专栏&#xff0c;朋友们看过来&#xff01; 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C语言开发基础总结》 《从0到1学习嵌入式Linux开发》 《QT开发实战》 《Android开发实…

【为什么控件的引用和控件的代理要用weak Objective-C语言】

一、还记得我们给大家说过,UI控件,当用一个属性,引用UI控件的时候,那个标记要用weak, 1.为什么,但是用strong,是不是也行, 但是,如果是控件的代理对象,是不是一定得用weak, 我现在就告诉你,为什么, 注意听,现在,比如说,这个是控制器, 我先解释,为什么UI控…

Java实战-基于JDK的LRU算法实现、优雅的实现代码耗时统计(Spring AOP、AutoCloseable方式)

场景 Java中基于JDK的LRU算法实现 LRU算法-缓存淘汰算法-Least recently used,最近最少使用算法 根据数据的历史访问记录来进行淘汰数据&#xff0c;其核心思想是&#xff1a;如果有数据最近被访问过&#xff0c;那么将来被访问的几率也更高 在Java中可以利用LinkedHashMap…

34. Linux系统下打包qt应用程序

1. 说明 对程序进行打包前需要在Release模式对程序代码进行编译,然后得到编译后的可执行文件,正常情况下这个可执行文件是可以双击打开运行的,如果无法双击运行,可在**.pro**文件内加入下面的代码: QMAKE_LFLAGS += -no-pie TEMPLATE = app同时将main.qml文件中的Window…

【总结】对接达梦数据库DM8详细教程

目录 1.达梦数据库-技术文档2.软件安装包下载2.1 iso 安装版2.2 docker 安装版 3.DM8单机安装部署规范4.安装操作步骤4.1 安装docker4.2 docker安装dameng&#xff08;推荐&#xff09; 5. 启动/停止数据库6.客户端连接使用7.DDL SQL实践7.1 创建表空间7.2 建表语句 8.DML SQL实…

「2023大学生就业报告 」出炉,应届生都去了哪些行业?

2023年的应届毕业生人数再创新高&#xff0c;达到1158万人&#xff0c;是不是开始担忧他们的就业了&#xff1f;别急&#xff0c;最近Boss直聘发布的一组数据&#xff0c;会让这样的担忧有所缓解。 期望薪资有所下降 和增长明显的毕业人数相反的是&#xff0c;这一届大专、本…

网络流量监控及流量异常检测

当今的企业面临着许多挑战&#xff0c;尤其是在监控其网络基础设施方面&#xff0c;需要确保随着网络规模和复杂性的增长&#xff0c;能够全面了解网络的运行状况和安全性。为了消除对网络性能的任何压力&#xff0c;组织应该采取的一项重要行动是使用随组织一起扩展的工具监控…

探究工业设备状态监测的典型对象和常用方法

工业设备状态监测的目的是实时掌握设备的健康状况&#xff0c;及时发现潜在故障迹象&#xff0c;并采取相应的维修和维护措施。通过有效的状态监测&#xff0c;企业可以降低设备故障风险&#xff0c;减少计划外停机时间&#xff0c;提高生产效率&#xff0c;节约维护成本&#…

深兰科技亮相2023数博会:硅基知识大模型推动个人数字化产业

近日&#xff0c;2023中国国际大数据产业博览会 “数字经济与实体经济深度融合”论坛在贵阳举行。腾讯云、京东集团、网易、深兰科技等8家企业负责人进行了行业演讲。 作为2023数博会的专业论坛之一&#xff0c;本次论坛以“数融百业 创变赋新”为主题&#xff0c;从数实融合视…

项目冲突管理机制的4大关键环节

1、冲突预防功能 预先采取一些措施防止冲突的产生&#xff0c;如建立有效的沟通机制。在项目开始前&#xff0c;制定沟通计划、沟通频率和方式&#xff0c;以确保项目成员充分了解自我职责和任务&#xff0c;并自愿分享和讨论。通过有效的沟通机制&#xff0c;最大限度避免不必…

QoS实现之限速

基于流分类&#xff08;MQC&#xff09;的流量监管 前面我们已经介绍过&#xff0c;流量监管一般用于入方向。下面举个例子&#xff0c;详细介绍如何在入方向配置基于MQC的流量监管。如图2所示&#xff0c;企业的语音业务对应的VLAN ID为120&#xff0c;视频业务对应的VLAN ID…

自学网安该怎么做以及怎么找工作?

趁着今天下班&#xff0c;我花了几个小时整理了下&#xff0c;非常不易&#xff0c;希望大家可以点赞收藏支持一波&#xff0c;谢谢。 我的经历&#xff1a; 我 19 年毕业&#xff0c;大学专业是物联网工程&#xff0c;我相信很多人在象牙塔里都很迷茫&#xff0c;到了大三大…

图解LeetCode——146. LRU 缓存

一、题目 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0c;…

什么才是自动化测试框架?最流行的自动化测试框架整理,你的进阶之路...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Python自动化测试&…