PreProcessFlow.java 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. package com.miniframe.service;
  2. import java.util.Date;
  3. import java.util.Map;
  4. import com.google.gson.Gson;
  5. import com.miniframe.bisiness.service.LoginService;
  6. import com.miniframe.config.Config;
  7. import com.miniframe.core.ExecProcessFlow;
  8. import com.miniframe.core.SearchExecProcess;
  9. import com.miniframe.core.exception.BaseException;
  10. import com.miniframe.core.exception.BusinessException;
  11. import com.miniframe.core.ext.UtilTools;
  12. import com.miniframe.tools.JwtManageUtil;
  13. import io.jsonwebtoken.Claims;
  14. import io.netty.handler.codec.http.HttpHeaders;
  15. import io.netty.handler.codec.http.HttpRequest;
  16. //交易执行前处理流程调用
  17. public class PreProcessFlow implements ExecProcessFlow{
  18. private static boolean isInit=false;
  19. private static String CLIENT_TOKEN="clientToken",TRANS_CODE="transCode",USERID="userId";
  20. static{
  21. ///////////////////不需要做任何验证的部分/////////////////////////
  22. AccessCfg.addDirectTransCode("HM0000");
  23. AccessCfg.addDirectTransCode("HM0001");
  24. AccessCfg.addDirectTransCode("HM0002");
  25. /////////////////////////////////////////////////////////////////////////
  26. ///////////////////设置访问都要通过令牌验证/////////////////////////
  27. AccessCfg.addTransCodeForUser("service","SYSUSER01");
  28. /////////////////////////////////////////////////////////////////////////
  29. ///////////////////修改用户默认saltToken/////////////////////////
  30. AccessCfg.setUserSaltToken("service","12345678901234567890");
  31. /////////////////////////////////////////////////////////////////////////
  32. }
  33. private void init(){
  34. if(!isInit) {
  35. synchronized (this) {
  36. if (!isInit) {
  37. isInit = true;
  38. ///////////////////默认所有数据库访问都要通过令牌验证/////////////////////////
  39. Map<String, String> execDbProcessMap = SearchExecProcess.execDbProcessMap;
  40. for (String dbKey : execDbProcessMap.keySet()) {
  41. AccessCfg.addTransCodeForUser("manager",dbKey);
  42. }
  43. /////////////////////////////////////////////////////////////////////////
  44. ///////////////////根据需要去掉数据库某些表不开放访问/////////////////////////
  45. //...rmTransCodeUsers()
  46. /////////////////////////////////////////////////////////////////////////
  47. }
  48. }
  49. }
  50. }
  51. private Map checkJwt(Map map) throws BusinessException {
  52. String transCode=(String)map.get(TRANS_CODE);
  53. HttpRequest httpRequest=UtilTools.getHttpRequest();
  54. String authToken=httpRequest.headers().get("x-auth-token"); //从头里取
  55. String authUserId=httpRequest.headers().get("x-auth-user");
  56. String uri = UtilTools.getHttpRequest().uri();
  57. if(UtilTools.isNotNullAndBlank(authToken) && AccessCfg.accessUserMap.containsKey(authUserId)) {
  58. AccessCfg.AccessUser accessUser=AccessCfg.accessUserMap.get(authUserId);
  59. if(accessUser.hasTransCode(transCode)) {
  60. try {
  61. String saltToken = accessUser.getUserSaltToken();
  62. String serviceToClientSecret = accessUser.getUserSecret();
  63. Claims c = JwtManageUtil.parseJWT(serviceToClientSecret, authToken);
  64. String unidqueId = c.getId(); //唯一ID
  65. String issuer = c.getIssuer(); //颁发者
  66. String userJson = c.getSubject(); //客户身份信息
  67. Date issuedAt = c.getIssuedAt(); //token产生时间
  68. Date expiration = c.getExpiration(); //token到期时间
  69. //令牌过期,暂不判断
  70. // if(new Date().getTime()>expiration.getTime()){
  71. // throw new BusinessException("EB8000103");
  72. // }
  73. if (UtilTools.isNotNullAndBlank(unidqueId) && unidqueId.equals(Config.uniqueid)
  74. && UtilTools.isNotNullAndBlank(issuer) && issuer.equals("XI-TECH")
  75. && UtilTools.isNotNullAndBlank(saltToken)) {
  76. if (UtilTools.isNotNullAndBlank(userJson)) {
  77. JwtManageUtil.JwtUser clientUser = new Gson().fromJson(userJson, JwtManageUtil.JwtUser.class);
  78. if (clientUser != null && UtilTools.isNotNullAndBlank(clientUser.getUserId()) && UtilTools.isNotNullAndBlank(clientUser.getUserCrc())) {
  79. String computeClientUserCrc = JwtManageUtil.getMD5(authUserId + saltToken).toLowerCase();
  80. if (clientUser.getUserId().equals(authUserId) && clientUser.getUserCrc().toLowerCase().equals(computeClientUserCrc)) {
  81. return map;
  82. }
  83. }
  84. }
  85. }
  86. } catch (Exception e) {
  87. }
  88. }
  89. }
  90. throw new BusinessException("EB8000012");
  91. }
  92. //调用交易执行前处理
  93. @SuppressWarnings({ "rawtypes", "unchecked" })
  94. @Override
  95. public Map execute(Map map) throws Exception {
  96. String clientToken=(String)map.get(CLIENT_TOKEN);
  97. String transCode=(String)map.get(TRANS_CODE);
  98. String userId=(String)map.get(USERID);
  99. HttpRequest httpRequest=UtilTools.getHttpRequest();
  100. HttpHeaders headers=httpRequest.headers();
  101. String authToken=httpRequest.headers().get("x-auth-token");
  102. String authUserId=httpRequest.headers().get("x-auth-user");
  103. String uri = UtilTools.getHttpRequest().uri();
  104. //init();
  105. //不用验证的交易
  106. if(AccessCfg.filterMap.containsKey(transCode)){
  107. System.out.println(transCode);
  108. return map;
  109. }
  110. //需要验证令牌的交易,数据库交易必须在accessUserMap里添加
  111. if(UtilTools.isNotNullAndBlank(authUserId) && AccessCfg.accessUserMap.containsKey(authUserId)){
  112. System.out.println(transCode);
  113. return checkJwt(map);
  114. }
  115. //数据库交易这里全部不允许执行,只有在accessUserMap定义的用户和数据库交易码可以在上面验证通过执行
  116. //内管支持登录用户访问数据库
  117. // if(SearchExecProcess.execDbProcessMap.containsKey(transCode)){
  118. // throw new BusinessException("EB8000012");
  119. // }
  120. //验证DN ,如果不是DN ,验证用户登录
  121. boolean checkDn=false;
  122. if(UtilTools.isNotNullAndBlank(userId)){
  123. checkDn=LoginService.verflyDNToKen(userId,clientToken);
  124. }
  125. if(!checkDn){
  126. LoginService.checkSecurity(clientToken, transCode);
  127. }
  128. return map;
  129. }
  130. }