## 前言
* 随着对系统安全性要求的逐步提高,单纯的jwt传输已经无法满足外部对于“安全”的定义
* 需要对jwt加密传输但又不影响系统整体功能使用的需求迫在眉睫
* SpringBlade经过巧妙设计,以极小的改动,支持了jwt的加密传输并且不影响现有的任何业务代码
## 令牌调用流程
1. 前端通过api调用时,会将Token放入header传递给后端
2. 后端在执行接口之前,获取请求的header并对Token进行解析
3. 若解析校验失败或者Token过期,则拒绝接口访问
4. 若解析校验成功,则进入接口逻辑,并且可获取Token解析后的关键字段
## 实现加密思路
##### 在不影响整体流程的前提下,我们进行了下述 <span style="color:red">红字 </span> 部分的操作,可插拔的形式,完全不影响,改动也非常小
1. 前端通过api调用时,<span style="color:red">先对Token进行可解密的Aes加密</span>,将<span style="color:red">加密后</span>的Token放入header传递给后端
2. 后端在执行接口之前,获取请求的header并对Token进行解析,<span style="color:red">若判断为加密Token,则先进行解密</span>
3. <span style="color:red">将解密后获取的原版Token往下传递</span>,若解析校验失败或者Token过期,则拒绝接口访问
4. 若解析校验成功,则进入接口逻辑,并且可获取Token解析后的关键字段
## 开始对接
1. 前端找到需要进行加密传输的接口,加上 `cryptoToken: true` 的配置,具体如下
```javascript
export const getList = (current, size, params) => {
return request({
url: '/blade-desk/notice/list',
method: 'get',
params: {
...params,
current,
size,
},
cryptoToken: true,
});
};
```
2. 找到前端的crypto工具类,修改aesKey的值,<span style="color:red">注意这个值不要用bladex自带提供的,一定要自行用AesUtil.genAesKey重新获取,否则容易被别人恶意利用</span>
![](https://img.kancloud.cn/bd/9e/bd9e68981a3ee404d261dc0b9e3a5b8f_1526x378.png)
3. 找到后端的配置,将值设置为前端一致
![](https://img.kancloud.cn/6c/cb/6ccb98f0f7a63c072ff6ee295db6f92a_1908x1576.png)
4. 配置完毕,token全自动的加密解密就做好了,之前写的业务代码无需做任何变动
## 进阶配置
1. 经过上述配置之后,后端接口可以同时解析jwt和加密后的jwt,攻击者仍然可以伪造jwt进行渗透攻击
2. 为了近一步安全考虑,我们可以强制指定某些接口只接受加密jwt,如此一来,就提高了渗透攻击的难度,加强了系统的安全性
3. 强制指定可以有两种方式进行
4. 通过注解 `@PreAuth(AuthConstant.HAS_CRYPTO)` 实现,可以放在方法上也可以放在controller上
```java
@PreAuth("hasCrypto()")
@GetMapping("/detail")
@ApiOperationSupport(order = 1)
@ApiOperation(value = "详情", notes = "传入notice")
public R<NoticeVO> detail(Notice notice) {
Notice detail = noticeService.getOne(Condition.getQueryWrapper(notice));
return R.data(NoticeWrapper.build().entityVO(detail));
}
```
7. 配置好之后,我们实际操作看下network的参数,可以看到token传输已加密并且返回了正确的数据
![](https://img.kancloud.cn/5f/4b/5f4b09bf5c5cdae61254238b85c83972_2590x1846.png)
![](https://img.kancloud.cn/5f/4b/5f4b09bf5c5cdae61254238b85c83972_2590x1846.png)
![](https://img.kancloud.cn/a0/61/a061720bbe7a589be6afa571c8227893_2580x1842.png)
- 第零章 序
- 序言
- 系统架构
- 视频公开课
- 开源版介绍
- 商业版介绍
- 功能对比
- 答疑流程
- 第一章 快速开始
- 升级必看
- 环境要求
- 环境准备
- 基础环境安装
- Docker安装基础服务
- Nacos安装
- Sentinel安装
- 插件安装
- 建数据库
- 工程导入
- 导入Cloud版本
- 导入Nacos配置
- 导入Boot版本
- 工程运行
- 运行Cloud版本
- 运行Boot版本
- 工程测试
- 测试Cloud版本
- 测试Boot版本
- 第二章 技术基础
- Java
- Lambda
- Lambda 受检异常处理
- Stream 简介
- Stream API 一览
- Stream API (上)
- Stream API (下)
- Optional 干掉空指针
- 函数式接口
- 新的日期 API
- Lombok
- SpringMVC
- Swagger
- Mybatis
- Mybatis-Plus
- 开发规范
- 第三章 开发初探
- 新建微服务工程
- 第一个API
- API鉴权
- API响应结果
- Redis缓存
- 第一个CRUD
- 建表
- 建Entity
- 建Service和Mapper
- 新增 API
- 修改 API
- 删除 API
- 查询 API
- 单条数据
- 多条数据
- 分页
- 微服务远程调用
- 声明式服务调用 Feign
- 熔断机制 Hystrix
- 第四章 开发进阶
- 聚合文档
- 鉴权配置
- 跨域处理
- Xss防注入
- 自定义启动器
- Secure安全框架
- Token认证简介
- Token认证配置
- PreAuth注解配置
- Token认证实战
- Token认证加密
- 日志系统
- 原理解析
- 功能调用
- Seata分布式事务
- 简介
- 编译包启动
- 配置nacos对接
- docker启动
- 对接微服务
- 代码生成配置
- 前言
- 数据库建表
- 代码生成
- 前端配置
- 优化效果
- 第五章 功能特性
- SaaS多租户
- 概念
- 数据隔离配置
- 线程环境自定义租户ID
- 多终端令牌认证
- 概念
- 系统升级
- 使用
- 第三方系统登录
- 概念说明
- 对接说明
- 对接准备
- 配置说明
- 操作流程
- 后记
- UReport2报表
- 报表简介
- 对接配置
- 报表后记
- 动态数据权限
- 数据权限简介
- 数据权限开发
- 纯注解配置
- Web全自动配置
- 注解半自动配置
- 数据权限注意点
- 动态接口权限
- 乐观锁配置
- 统一服务登陆配置
- Skywalking追踪监控
- Minio分布式对象存储
- Boot版本对接至Cloud
- 第六章 生产部署
- windows部署
- linux部署
- jar部署
- docker部署
- java环境安装
- mysql安装
- docker安装
- docker-compose安装
- harbor安装
- 部署步骤
- 宝塔部署
- 准备工作
- 安装工作
- 部署准备
- 部署后端
- 部署前端
- 部署域名
- 结束工作
- k8s平台部署
- 第七章 版本控制
- Git远程分支合并
- Git地址更换
- 第八章 学习资料
- 第九章 FAQ
- 第十章 联系我们