
【后端-接口鉴权】java应用接口授权鉴权与URL防篡改详细设计
文章已收录至https://lichong.work,转载请注明原文链接。 ps:欢迎关注公众号“Fun肆编程”或添加我的私人微信交流经验🤝
一、背景
- 平台类系统在无API网关场景下缺乏接口鉴权功能,容易被未知第三方攻击
- 需要支持
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肆编程”或添加我的私人微信交流经验🤝