文章已收录至https://lichong.work,转载请注明原文链接。 ps:欢迎关注公众号“Fun肆编程”或添加我的私人微信交流经验🤝

一、背景

  1. 平台类系统在无API网关场景下缺乏接口鉴权功能,容易被未知第三方攻击
  2. 需要支持URL防篡改

二、设计方案

接口鉴权

  1. 颁发授权码

    系统内部维护一系列授权码,授权码绑定接口白名单,第三方系统调用时需要header携带拥有权限的授权码才能访问指定某些接口。

  2. 使用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时,拦截对外接口,从urlauthcodeheader中获取到授权码,判断此授权码有没有当前正在请求接口的权限(缓存中获取),有则放行,无则返回403Forbidden拦截。

4. URL防篡改支持

新增过滤器InterfaceTrSecurityFilter,优先级在和InterfaceAuthSecurityFilter之后,在work.lichong.interface.tr.open配置项值为1时,拦截对外接口,从header中获取urlmd5对应的值,再将请求URL进行MD5加密,两值对比一致即可放行,不一致则返回403Forbidden拦截。

5. 对系统SDK请求授权支持

接口授权管理数据库表中内置一条SDK使用的授权信息(接口授权管理页面应该过滤掉,用户不可见),接口白名单内仅有SDK使用到的接口,修改SDK中请求逻辑,将授权码和URLMD5加密值分别存入urlauthcodeurlmd5header中。

6. 数据库设计

字段名类型长度备注
C_IDVARCHAR50主键
C_ACCOUNTIDVARCHAR50创建人账号ID
C_NAMEVARCHAR100名称
C_URLSTEXT接口白名单(英文分号间隔)
C_AUTH_CODEVARCHAR100授权码
N_STATUSNUMERIC3是否启用(1-启用,2-暂停)
DT_CREATETIMETIMESTAMP6创建时间
DT_UPDATETIMETIMESTAMP6更新时间

7. 接口设计

略(都是增删改查,就不写了)

五、需要自己完善的内容

  1. 数据权限待完善,预留字段C_ACCOUNTID。目前默认管理员可见。
  2. 授权码生成算法

文章已收录至https://lichong.work,转载请注明原文链接。 ps:欢迎关注公众号“Fun肆编程”或添加我的私人微信交流经验🤝