JeecgBoot icon indicating copy to clipboard operation
JeecgBoot copied to clipboard

签名拦截器 SignAuthInterceptor, 时间戳判断BUG

Open catlvsuger opened this issue 1 year ago • 2 comments

版本号:3.6.1
问题描述:签名拦截器 SignAuthInterceptor, 整点之间可能会出现时间戳判断超时

如传参时间戳:20240828115959, 校验时 20240828120000 , 两者差是4041,值远大于300,就会返回签名已失败

错误截图:

image

友情提示:

  • 未按格式要求发帖、描述过于简单的,会被直接删掉;
  • 描述问题请图文并茂,方便我们理解并快速定位问题;
  • 如果使用的不是master,请说明你使用的分支;

catlvsuger avatar Aug 28 '24 05:08 catlvsuger

解决: //转成时间判断 Date date = DateUtils.str2Date(xTimestamp, DateUtils.yyyymmddhhmmss.get()); if (date == null || Math.abs(DateUtils.dateDiff('s', new Date(), date)) > MAX_EXPIRE) { log.error("签名验证失败:X-TIMESTAMP已过期,注意系统时间和服务器时间是否有误差!"); throw new IllegalArgumentException("签名验证失败:X-TIMESTAMP已过期"); }

        public static int dateDiff(char flag, Date startTime, Date endTime) {
    Calendar c1 = Calendar.getInstance();
    Calendar c2 = Calendar.getInstance();
    c1.setTime(startTime);
    c2.setTime(endTime);
    long millisDiff = getMillis(c1) - getMillis(c2);
    int diff;
    switch (flag) {
        case 'y':
            diff = c1.get(Calendar.YEAR) - c2.get(Calendar.YEAR);
            break;
        case 'M':
            diff = (c1.get(Calendar.YEAR) - c2.get(Calendar.YEAR)) * 12 + c1.get(Calendar.MONTH) - c2.get(Calendar.MONTH);
            break;
        case 'd':
            diff = (int) (millisDiff / DAY_IN_MILLIS);
            break;
        case 'h':
            diff = (int) (millisDiff / HOUR_IN_MILLIS);
            break;
        case 'm':
            diff = (int) (millisDiff / MINUTE_IN_MILLIS);
            break;
        case 's':
            diff = (int) (millisDiff / SECOND_IN_MILLIS);
            break;
        default:
            diff = 0;
            break;

    }
    return diff;
}

catlvsuger avatar Aug 28 '24 06:08 catlvsuger

你可以改最大校验值,说明前端和后端服务器误差较大

zhangdaiscott avatar Aug 28 '24 06:08 zhangdaiscott