简单的接口签名认证

 

public void addInterceptors(InterceptorRegistry registry) {
  //接口签名认证拦截器,该签名认证比较简单,实际项目中可以使用Json Web Token或其他更好的方式替代。
  if (!"dev".equals(env)) { //开发环境忽略签名认证
      registry.addInterceptor(new HandlerInterceptorAdapter() {
          @Override
          public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
              //验证签名
              boolean pass = validateSign(request);
              if (pass) {
                  return true;
              } else {
                  logger.warn("签名认证失败,请求接口:{},请求IP:{},请求参数:{}",
                          request.getRequestURI(), getIpAddress(request), JSON.toJSONString(request.getParameterMap()));

                  Result result = new Result();
                  result.setCode(ResultCode.UNAUTHORIZED).setMessage("签名认证失败");
                  responseResult(response, result);
                  return false;
              }
          }
      });
  }
}
/**
* 一个简单的签名认证,规则:
* 1. 将请求参数按ascii码排序
* 2. 拼接为a=value&b=value...这样的字符串(不包含sign)
* 3. 混合密钥(secret)进行md5获得签名,与请求的签名进行比较
*/
private boolean validateSign(HttpServletRequest request) {
      String requestSign = request.getParameter("sign");//获得请求签名,如sign=19e907700db7ad91318424a97c54ed57
      if (StringUtils.isEmpty(requestSign)) {
          return false;
      }
      List<String> keys = new ArrayList<String>(request.getParameterMap().keySet());
      keys.remove("sign");//排除sign参数
      Collections.sort(keys);//排序

      StringBuilder sb = new StringBuilder();
      for (String key : keys) {
          sb.append(key).append("=").append(request.getParameter(key)).append("&");//拼接字符串
      }
      String linkString = sb.toString();
      linkString = StringUtils.substring(linkString, 0, linkString.length() - 1);//去除最后一个'&'

      String secret = "Potato";//密钥,自己修改
      String sign = DigestUtils.md5Hex(linkString + secret);//混合密钥md5

      return StringUtils.equals(sign, requestSign);//比较
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值