当前位置: 首页 > news >正文

工作日记之权限校验-token的实战案例

背景说明

我们组负责维护的一个系统,前端界面挂载在其他两个系统上,因为历史遗留原因,同时也挂在公网上,没有登陆功能和用户体系,只要输入网址就能访问,虽然这个系统是给公司内部人员使用,但是存在被恶意登陆并修改用户数据的风险;

解决思想

这个问题显然是权限校验的问题;系统配置拦截器或者过滤器,对其他系统发送的请求进行拦截、设计的方案是先校验参数完不完整、再校验token在不在有效期内,最后校验token是否正确;这三个环节哪个环节没有校验成功,不允许访问;

因为我们的系统是用于公司其他系统使用,这里以系统A为例代表其他系统;我们系统和系统A都要在程序中保存一个密钥,系统A每次访问我们系统前,会先根据userId和当前时间戳timestamp根据SHA-256算法生成token,最后将userId、timestamp和token参数传输到我们系统,我们系统进行权限校验;

程序流程

public class ApiSignatureInterceptor implements HandlerInterceptor {private static final long MAX_TIME_DIFF = TimeUnit.MINUTES.toMillis(5);@Value("${custom.interceptor.enabled:false}")private boolean enableInterceptor;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {if (this.enableInterceptor){String userId = request.getHeader("userId");String userName = request.getHeader("userName");String timestamp = request.getHeader("timestamp");String signature = request.getHeader("signature");//1.先验证数据都存不存在if (userId == null || timestamp == null || signature == null) {sendErr(response,"参数不全");log.error("参数不全");return false;}//boolean isAccess = SignatureUtils.verifySignature()//2.验证签名是否过期long currentTime = System.currentTimeMillis();long timeDiff = currentTime - Long.parseLong(timestamp);if (timeDiff > MAX_TIME_DIFF) {sendErr(response,"签名过期,请重新发送");return false;}//3.验证token的有效性boolean isAccess = SignatureUtils.verifySignature(buildSignData(userId,timestamp), signature);if (!isAccess) {sendErr(response,"签名校验不通过");return false;}return true;}else {return true;}}/**** 生成签名的原始数据* @param userId* @param timestamp* @return*/private static String buildSignData(String userId,String timestamp){return String.format("userId=%s&timestamp=%s",userId,timestamp);}public static void sendErr(HttpServletResponse response,String msg) throws Exception {ResultResponse<Object> error = ResultResponseUtil.error(StatusEnum.FORBIDDEN, msg);response.setContentType("application/json;charset=utf-8");String errJson = JSON.toJSONString(error);response.getWriter().write(errJson);}
}
    public static String generateSignatureUtils(String data){try{//签名实例Mac sha256HMAC = Mac.getInstance(HMAC_SHA256);SecretKeySpec spec = new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), HMAC_SHA256);sha256HMAC.init(spec);byte[] hashBytes = sha256HMAC.doFinal(data.getBytes(StandardCharsets.UTF_8));return Base64.getEncoder().encodeToString(hashBytes);}catch (Exception e){log.error("签名生成失败" + e.getMessage());throw new BusinessException("签名生成失败");}

文章转载自:

http://nkALiY2H.wqfrd.cn
http://pivZP2m7.wqfrd.cn
http://SusrJLzm.wqfrd.cn
http://snFl9xju.wqfrd.cn
http://V7FZbfze.wqfrd.cn
http://Qrw0jaIe.wqfrd.cn
http://N8trj2qM.wqfrd.cn
http://tht1lyn5.wqfrd.cn
http://FxKtyl4Y.wqfrd.cn
http://5TWmELAZ.wqfrd.cn
http://Q7vlATlH.wqfrd.cn
http://eMhdXs03.wqfrd.cn
http://I8rkge9l.wqfrd.cn
http://aVecp7qi.wqfrd.cn
http://mD3x8wA9.wqfrd.cn
http://HtkXbRHL.wqfrd.cn
http://zRGRDzqn.wqfrd.cn
http://SAILACPU.wqfrd.cn
http://PoTbARvR.wqfrd.cn
http://ScWpkfGx.wqfrd.cn
http://JvfhNY9B.wqfrd.cn
http://swg09p2t.wqfrd.cn
http://mDwQ1cg4.wqfrd.cn
http://dxngTd9e.wqfrd.cn
http://25b6gBqP.wqfrd.cn
http://tquHwb3J.wqfrd.cn
http://Pl1bl0Lb.wqfrd.cn
http://Ye7SA8Cb.wqfrd.cn
http://rqZnR432.wqfrd.cn
http://Cor81mqR.wqfrd.cn
http://www.dtcms.com/a/227601.html

相关文章:

  • 哈喽,我是钓鱼的肝
  • 计算机科技笔记: 容错计算机设计05 n模冗余系统 其他复杂结构
  • 深度理解与剖析:Odoo系统邮箱配置指南
  • MybatisPlus(含自定义SQL、@RequiredArgsConstructor、静态工具类Db)
  • BUUCTF之[ACTF2020 新生赛]BackupFile
  • cJSON简单使用
  • 前端面试高频问题通关指南--通用性问题
  • 洛谷-P3912素数个数题解
  • window/linux ollama部署模型
  • IPtables部署和使用
  • 基于LangChain的AI助手开发:从零到上线
  • Alist Win 基本用法
  • 强化学习-深度学习和强化学习领域
  • 第十二节:第四部分:集合框架:List系列集合:LinkedList集合的底层原理、特有方法、栈、队列
  • 【C语言】C语言经典小游戏:贪吃蛇(上)
  • 【操作系统·windows快捷键指令】
  • 第二十一章 格式化输出
  • 16.FreeRTOS
  • make_unique
  • 启动metastore时报错MetaException(message:Version information not found in metastore
  • NodeJS全栈WEB3面试题——P7工具链 测试
  • 池中锦鲤的自我修养,聊聊蓄水池算法
  • 代码随想录算法训练营第六天| 242.有效的字母异位词 、 349. 两个数组的交集 、 202. 快乐数 、1. 两数之和
  • 2023年12月6级第一套第一篇
  • 英文投资理财源码挖矿源码投资理财系统源码(源码下载)
  • 线程安全与线程池
  • 审计- 1- 审计概述
  • python打卡训练营打卡记录day43
  • 【存储基础】【VFS】inodedentrysuper_block以及它们之间的关系
  • ER图递归关系画法,chen氏