ITPub博客

首页 > 应用开发 > Java > SOA中springmvc中restful服务的数据权限加密方式分享

SOA中springmvc中restful服务的数据权限加密方式分享

原创 Java 作者:fumi106 时间:2020-11-10 11:11:22 0 删除 编辑

restful中数据权限加密方式有很多种,特别是针对于request json的方式加密,这里详细介绍了SOA中针对于get、post数据加密方式,保证数据传输中的安全性: 

 

Java代码   收藏代码
  1. @Component ( "dataSignInterceptor" )  
  2. public   class  DataSignInterceptor  implements  MethodInterceptor {  
  3.      @Autowired   
  4.      private  SoaServiceConfigService soaServiceConfigService;  
  5.   
  6.      @Autowired   
  7.      private  SoaAppSecretService soaAppSecretService;  
  8.       
  9.      @Autowired   
  10.      private  SoaServiceApplyService soaServiceApplyService;  
  11.       
  12.      public  Object invoke(MethodInvocation mi)  throws  Throwable {  
  13.          //TODO 此处应该先查询缓存   
  14.          //获取所有未管控的服务列表   
  15.         List<SoaServiceConfig> soaServiceConfigList = soaServiceConfigService.findNoSwitchList();  
  16.          if (soaServiceConfigList !=  null ){  
  17.              //放入缓存   
  18.         }  
  19.         Object[] ars = mi.getArguments();  
  20.   
  21.          // 判断该方法是否加了DataSign 注解   
  22.          if  (mi.getMethod().isAnnotationPresent(DataSign. class )) {  
  23.              // 获取拦截方法的请求参数   
  24.             HttpServletRequest request =  null ;  
  25.             JSONObject jsonBody =  null ;  
  26.             Map<String, String> reqGetParamMap =  null ;  // 客户端传递的参数信息   
  27.             Map<String, String> reqPostParamMap =  null ;  // 客户端传递的参数信息   
  28.             Map<String, String> resultParamMap =  new  HashMap<String, String>();  
  29.              for  (Object obj : ars) {  
  30.                  if  (obj  instanceof  HttpServletRequest) {  
  31.                     request = (HttpServletRequest) obj;  
  32.                     reqGetParamMap = (Map<String, String>) request.getParameterMap();  
  33.                     Set keSet = reqGetParamMap.entrySet();  
  34.                      for  (Iterator itr = keSet.iterator(); itr.hasNext();) {  
  35.                         Map.Entry me = (Map.Entry) itr.next();  
  36.                         String key = me.getKey().toString();  
  37.                         Object ov = me.getValue();  
  38.                         String[] value = new  String[ 1 ];    
  39.                          if (ov  instanceof  String[]){    
  40.                             value=(String[])ov;    
  41.                         } else {    
  42.                             value[ 0 ]=ov.toString();    
  43.                         }    
  44.                           
  45.                         resultParamMap.put(key, value[ 0 ]);  
  46.                     }  
  47.                 }  else   if  (obj  instanceof  JSONObject) {  
  48.                     jsonBody = (JSONObject) obj;  
  49.                     ObjectMapper objMap =  new  ObjectMapper();  
  50.                     reqPostParamMap = objMap.readValue(jsonBody.toString(), Map. class );  
  51.                     resultParamMap = reqPostParamMap;  
  52.                 }  
  53.             }  
  54.               
  55.             String serviceUrl = request.getServletPath();  
  56.              if (StringUtils.isNotEmpty(serviceUrl)){  
  57.                 serviceUrl = serviceUrl.substring(serviceUrl.indexOf( "/" , 2 ));  
  58.             }  
  59.               
  60.              //TODO 应该从缓存取,当前先这样处理   
  61.              //如果所有未管控的服务列表中包含用户请求的服务连接,则不需要再进行管控,直接放开服务控制权   
  62.              if (soaServiceConfigList !=  null ){  
  63.                  for (SoaServiceConfig soaServiceConfig : soaServiceConfigList){  
  64.                      if (serviceUrl.equals(soaServiceConfig.getServiceUrl())){  
  65.                          return  mi.proceed();  
  66.                     }  
  67.                 }  
  68.             }  
  69.               
  70.             String reqSign = resultParamMap.get( "sign" ); // 客户端传递的签名认证信息   
  71.              // 验证签名不能为空   
  72.              if  (StringUtils.isEmpty(reqSign)) {  
  73.                  return   new  ResponseVO(DataSignEnum.SIGN_NOT_NULL.getCode(), DataSignEnum.SIGN_NOT_NULL.getMessage(),  
  74.                          null );  
  75.             }  
  76.   
  77.             String appname = resultParamMap.get( "appname" );  
  78.              // 验证应用名不能为空   
  79.              if  (StringUtils.isEmpty(appname)) {  
  80.                  return   new  ResponseVO(DataSignEnum.APPNAME_NOT_NULL.getCode(),  
  81.                         DataSignEnum.APPNAME_NOT_NULL.getMessage(),  null );  
  82.             }  
  83.               
  84.             SoaServiceApply soaServiceApply = soaServiceApplyService.getServiceApplyByAppname(serviceUrl, appname);  
  85.              if ( null  == soaServiceApply){  
  86.                  return   new  ResponseVO(DataSignEnum.APPNAME_NOT_APPLY.getCode(),  
  87.                         DataSignEnum.APPNAME_NOT_APPLY.getMessage(),  null );  
  88.             }  
  89.               
  90.             SoaAppSecret soaAppSecret = soaAppSecretService.findAppSecretByAppName(appname);  
  91.              if ( null  == soaAppSecret){  
  92.                  return   new  ResponseVO(DataSignEnum.APPNAME_NOT_EXISTS.getCode(),  
  93.                         DataSignEnum.APPNAME_NOT_EXISTS.getMessage(),  null );  
  94.                   
  95.             }  
  96.              // 根据参数重新生成新的签名sign(因为sign不能认为是业务参数,故将sign从map中移除后再加密)   
  97.             resultParamMap.remove( "sign" );  
  98.               
  99.             resultParamMap.put( "token" , soaAppSecret.getToken());  
  100.             String sign = MD5Utils.paramString(resultParamMap);  
  101.   
  102.              // 根据应用名获取应用名对应的秘钥(目的是和url请求的参数一起进行签名认证)   
  103.              if  (!StringUtils.equals(sign, reqSign)) {  
  104.                  return   new  ResponseVO(DataSignEnum.SIGN_NOT_MATCH.getCode(), DataSignEnum.SIGN_NOT_MATCH.getMessage(),  
  105.                          null );  
  106.             }  
  107.         }  
  108.          // 执行被拦截的方法,切记,如果此方法不调用,则被拦截的方法不会被执行。   
  109.          return  mi.proceed();  
  110.     }  
  111.   
  112.      /** 
  113.      * 数据签名枚举 
  114.      *  
  115.      * @author Administrator 
  116.      */   
  117.      public   enum  DataSignEnum {  
  118.         SIGN_NOT_NULL( 2001 ,  "签名不能为空." ),   
  119.         SIGN_NOT_MATCH( 2002 ,  "签名不匹配,传递的数据被篡改过." ),   
  120.         APPNAME_NOT_NULL( 2003 ,  "应用名不能为空." ),  
  121.         APPNAME_NOT_EXISTS( 2004 ,  "应用名不存在." ),  
  122.         APPNAME_NOT_APPLY( 2005 ,  "当前应用没有权限访问此服务,请联系管理员进行服务申请." );  
  123.   
  124.          // 成员变量   
  125.          private   int  code;  // 状态码   
  126.          private  String message;  // 返回消息   
  127.          // 构造方法   
  128.   
  129.          private  DataSignEnum( int  code, String message) {  
  130.              this .code = code;  
  131.              this .message = message;  
  132.         }  
  133.   
  134.          public   int  getCode() {  
  135.              return  code;  
  136.         }  
  137.   
  138.          public   void  setCode( int  code) {  
  139.              this .code = code;  
  140.         }  
  141.   
  142.          public  String getMessage() {  
  143.              return  message;  
  144.         }  
  145.   
  146.          public   void  setMessage(String message) {  
  147.              this .message = message;  
  148.         }  
  149.     }  
  150.   
  151. }  

 

到此结束!!(企业架构源码可以加求球:叁五三陆二肆柒二伍玖)


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69984376/viewspace-2733214/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2020-09-22

  • 博文量
    51
  • 访问量
    25933