目录
文章已收录至https://lichong.work,转载请注明原文链接。
ps:欢迎关注公众号“Fun肆编程”或添加我的私人微信交流经验🤝
一、背景
- 平台类系统缺乏接口鉴权功能,容易被未知第三方攻击
- 需要支持
URL
防篡改
二、设计方案
-
颁发授权码
系统内部维护一系列授权码,授权码绑定接口白名单,第三方系统调用时需要
header
携带拥有权限的授权码才能访问指定某些接口。 -
使用
MD5
签名防止URL
被篡改第三方客户端发起请求时对
URL
进行MD5
加密,把签名放到请求头。系统做拦截,再次对URL
进行MD5加密,做签名对比,签名一致即可放行。
三、详细设计
1. 新增配置项
- 配置项一:接口授权管理是否生效
配置项:work.lichong.security.interface.managent.open
名称:接口授权管理是否生效
说明:系统对外接口授权管理功能的开关,默认不开启。
类型:是/否
默认值:否
- 配置项二:URL防篡改是否开启
配置项:work.lichong.security.interface.tr.open
名称:URL防篡改是否开启
说明:系统对外接口URL防篡改(Tamper Resistant)功能的开关,默认不开启。
类型:是/否
默认值:否
2. 新增接口授权管理页面
页面提供新增授权、维护授权、删除授权功能
-
新增授权
点击“新增授权”按钮,弹出表单,表单内可以编辑授权的接口,提交表单时各接口以分号间隔。
**表单内容:**授权名称、授权接口列表(支持正则)
新增成功后刷新接口授权表格
-
维护授权
接口授权管理页面有一个接口授权表格,分别有列:序号、名称、接口列表、操作,默认按照创建时间倒序排列。“操作”列提供“维护”按钮、“查看授权码”、“暂停/启用”、”删除“按钮。其中 操作事件:
- 维护:弹出表单,样式同“新增授权”一样,可进行编辑与保存。
- 查看授权码:弹出提示框,显示授权码。右下角提供“重置授权码”和“关闭”按钮,点击“重置授权码”后弹出提示框要求用户确认“重置后当前授权码将会失效且不可恢复,是否确认重置授权码?”
- 删除:点击“删除”后弹出提示框要求用户确认“删除当前授权信息后此授权将会失效且不可恢复,是否确认删除此授权?”
3. 接口授权过滤
新增过滤器InterfaceAuthSecurityFilter
,在work.lichong.security.interface.managent.open
配置项值为1时,拦截对外接口,从urlauthcode
的header
中获取到授权码,判断此授权码有没有当前正在请求接口的权限(缓存中获取),有则放行,无则返回403Forbidden
拦截。
4. URL防篡改支持
新增过滤器InterfaceTrSecurityFilter
,优先级在和InterfaceAuthSecurityFilter
之后,在work.lichong.interface.tr.open
配置项值为1时,拦截对外接口,从header
中获取urlmd5
对应的值,再将请求URL
进行MD5
加密,两值对比一致即可放行,不一致则返回403Forbidden
拦截。
5. 对系统SDK请求授权支持
接口授权管理数据库表中内置一条SDK
使用的授权信息(接口授权管理页面应该过滤掉,用户不可见),接口白名单内仅有SDK
使用到的接口,修改SDK
中请求逻辑,将授权码和URL
的MD5
加密值分别存入urlauthcode
和urlmd5
的header
中。
6. 数据库设计
字段名 | 类型 | 长度 | 备注 |
---|---|---|---|
C_ID | VARCHAR | 50 | 主键 |
C_ACCOUNTID | VARCHAR | 50 | 创建人账号ID |
C_NAME | VARCHAR | 100 | 名称 |
C_URLS | TEXT | 接口白名单(英文分号间隔) | |
C_AUTH_CODE | VARCHAR | 100 | 授权码 |
N_STATUS | NUMERIC | 3 | 是否启用(1-启用,2-暂停) |
DT_CREATETIME | TIMESTAMP | 6 | 创建时间 |
DT_UPDATETIME | TIMESTAMP | 6 | 更新时间 |
7. 接口设计
略(都是增删改查,就不写了)
五、需要自己完善的内容
- 数据权限待完善,预留字段
C_ACCOUNTID
。目前默认管理员可见。 - 授权码生成算法
文章已收录至https://lichong.work,转载请注明原文链接。
ps:欢迎关注公众号“Fun肆编程”或添加我的私人微信交流经验🤝
【Docker】入门教程-基本概念解读
【前端-开发环境】使用NVM实现不同nodejs版本的自由切换(NVM完整安装使用手册)
【前端-NPM私服】内网使用verdaccio搭建私有npm服务器
【前端-IE兼容】Win10和Win11使用Edge调试前端兼容IE6、IE7、IE8、IE9、IE10、IE11问题
【前端-工程化】React项目工程化记录-内置项目活文档(老项目升级优化-集成Hosky/ESLint/Prettier-升级Webpack/Babel/NodeSass/React)
【工具-TWRP-frp-Termux】旧手机暴改成免费云服务器-MIUI刷TWRP安装magisk获取root
【工具-Shell脚本】java程序产品包模板-linux和windows通用shell启动停止脚本(无需系统安装Java运行环境)
【工具-Nginx】从入门安装到高可用集群搭建
【工具-Nginx】Nginx高性能通用配置文件-注释版-支持防刷限流、可控高并发、HTTP2、防XSS、Gzip、OCSP Stapling、负载、SSL
【工具-WireShark】网络HTTP抓包使用教程
【后端-maven打包】通过profile标签解决同时打jar包 war包需求
【架构-DDD】使用领域驱动设计-互联网未来架构设计之道(一)
【后端-SpringCache】基于Spring Cache封装一个能够批量操作的Redis缓存记录下踩坑历程(pipeline或mget封装)
【后端-SkyWalking】SkyWalking前后端开发环境搭建详细教程步骤-6.x/7.x/8.x版本通用-插件二次开发利器(一)
【后端-Quartz】Springboot整合Quartz支持集群环境-设计业务与框架分离及实现定时任务调度
✨欢迎为耿直少年点赞、关注、收藏!!!
👇👇👇