CheckViewBizAuthAspect.java 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. package com.fdkankan.scene.Interceptor;
  2. import cn.hutool.core.util.StrUtil;
  3. import cn.hutool.core.util.URLUtil;
  4. import com.alibaba.fastjson.JSON;
  5. import com.fdkankan.common.constant.CommonStatus;
  6. import com.fdkankan.common.constant.ErrorCode;
  7. import com.fdkankan.common.constant.SceneStatus;
  8. import com.fdkankan.common.constant.ServerCode;
  9. import com.fdkankan.common.exception.BusinessException;
  10. import com.fdkankan.common.util.AesUtil;
  11. import com.fdkankan.common.util.Base64Converter;
  12. import com.fdkankan.common.util.PasswordUtils;
  13. import com.fdkankan.common.util.SecurityUtil;
  14. import com.fdkankan.redis.util.RedisUtil;
  15. import com.fdkankan.scene.entity.*;
  16. import com.fdkankan.scene.service.*;
  17. import com.fdkankan.scene.util.JmgaSSOLoginHelper;
  18. import com.fdkankan.web.response.ResultData;
  19. import com.fdkankan.web.user.SSOLoginHelper;
  20. import com.fdkankan.web.user.SSOUser;
  21. import com.fdkankan.web.util.WebUtil;
  22. import lombok.extern.log4j.Log4j2;
  23. import org.aspectj.lang.JoinPoint;
  24. import org.aspectj.lang.annotation.Aspect;
  25. import org.aspectj.lang.annotation.Before;
  26. import org.aspectj.lang.annotation.Pointcut;
  27. import org.springframework.beans.factory.annotation.Autowired;
  28. import org.springframework.beans.factory.annotation.Value;
  29. import org.springframework.core.annotation.Order;
  30. import org.springframework.stereotype.Component;
  31. import org.springframework.web.context.request.RequestContextHolder;
  32. import org.springframework.web.context.request.ServletRequestAttributes;
  33. import javax.annotation.Resource;
  34. import javax.crypto.Cipher;
  35. import javax.crypto.spec.SecretKeySpec;
  36. import javax.servlet.http.HttpServletRequest;
  37. import java.io.IOException;
  38. import java.net.InetAddress;
  39. import java.net.URL;
  40. import java.net.UnknownHostException;
  41. import java.nio.charset.StandardCharsets;
  42. import java.util.*;
  43. @Log4j2
  44. @Aspect
  45. @Component
  46. @Order(101)
  47. public class CheckViewBizAuthAspect {
  48. @Value("${scene.view.encrypt-key:3d8904474ebbdbbd81c5952524dad646}")
  49. private String ENCRYPT_KEY;
  50. @Resource
  51. private JmgaSSOLoginHelper jmgaSSOLoginHelper;
  52. @Autowired
  53. private RedisUtil redisUtil;
  54. @Autowired
  55. private IScenePlusService scenePlusService;
  56. @Autowired
  57. private ISceneCooperationService sceneCooperationService;
  58. @Autowired
  59. private IJySceneUserAuthService jySceneUserAuthService;
  60. @Autowired
  61. private IJySceneAuthService jySceneAuthService;
  62. @Autowired
  63. private IUserService userService;
  64. @Autowired
  65. private IJyUserService jyUserService;
  66. @Autowired
  67. private ISysLogService sysLogService;
  68. @Pointcut("@annotation(com.fdkankan.scene.annotation.CheckViewBizAuth)")
  69. public void checkViewBizAuth() {
  70. }
  71. /**
  72. * 前置通知 用于判断用户协作场景是否有协作权限
  73. *
  74. * @param joinPoint
  75. * 切点
  76. * @throws IOException
  77. */
  78. @Before("checkViewBizAuth()")
  79. public void doBefore(JoinPoint joinPoint) throws Exception {
  80. HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
  81. Map<String, Object> params = WebUtil.getParameter(joinPoint, request);
  82. String remoteIp = WebUtil.getIpAddress(request);
  83. String num = (String) params.get("num");
  84. String sign = (String) params.get("sign");
  85. SysLog sysLog = new SysLog();
  86. sysLog.setRequestPath("场景展示");
  87. sysLog.setUri(request.getRequestURI());
  88. sysLog.setMethod(request.getMethod());
  89. sysLog.setIp(remoteIp);
  90. sysLog.setBrowser(WebUtil.getBrowser(request));
  91. sysLog.setOperationType("scene-view");
  92. sysLog.setParams(JSON.toJSONString(params));
  93. boolean interruptCheck = false;
  94. String userName = null, ip = null, timestamp = null;
  95. try {
  96. if(StrUtil.isNotEmpty(sign)){
  97. interruptCheck = true;
  98. sign = sign.replaceAll("%2B", "+").replaceAll(" ", "+");
  99. String[] split = null;
  100. try {
  101. String decode = AesUtil.decryptECB(sign, ENCRYPT_KEY, "AES/ECB/PKCS5Padding");
  102. split = decode.split("@");
  103. }catch (Exception e){
  104. log.error("签名解密失败", e);
  105. throw new BusinessException(ErrorCode.AUTH_FAIL.code(), "签名解密失败");
  106. }
  107. if(Objects.isNull(split) || split.length == 1){
  108. throw new BusinessException(ErrorCode.AUTH_FAIL.code(), "签名参数错误");
  109. }else{
  110. for (int i = 0; i < split.length; i++){
  111. if(i == 0){
  112. userName = split[i];
  113. }
  114. if(i == 1){
  115. ip = split[i];
  116. }
  117. if(i == 2){
  118. timestamp = split[i];
  119. }
  120. }
  121. if(StrUtil.isNotEmpty(ip) && !ip.equals(remoteIp)){
  122. throw new BusinessException(ErrorCode.AUTH_FAIL.code(), "ip不匹配");
  123. }
  124. if(StrUtil.isNotEmpty(timestamp) && Calendar.getInstance().getTime().after(new Date(Long.valueOf(timestamp) * 1000))){
  125. throw new BusinessException(ErrorCode.AUTH_FAIL.code(), "超出访问截止时间");
  126. }
  127. }
  128. }
  129. //校验token
  130. if(!interruptCheck){
  131. log.info("num:{}", num);
  132. log.info("token:{}", request.getHeader("token"));
  133. String token = request.getHeader("token");
  134. if(StrUtil.isNotEmpty(token)){
  135. SSOUser user = jmgaSSOLoginHelper.getSsoUser(token);
  136. if(Objects.isNull(user)){
  137. throw new BusinessException(ErrorCode.AUTH_FAIL.code(), ErrorCode.TOKEN_NOT_FOUND.message());
  138. }
  139. JyUser jyUser = jyUserService.getBySysUserId(user.getId().intValue());
  140. log.info("user:{}", JSON.toJSONString(user));
  141. ScenePlus scenePlus = scenePlusService.getScenePlusByNum(num);
  142. if(Objects.isNull(scenePlus)){
  143. throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
  144. }
  145. log.info("scenePlus:{}", scenePlus);
  146. if(Objects.isNull(scenePlus.getUserId()) || Objects.isNull(jyUser) || jyUser.getUserId() != scenePlus.getUserId().intValue()){
  147. throw new BusinessException(ErrorCode.AUTH_FAIL.code(), "无权访问");
  148. }else{
  149. interruptCheck = true;
  150. userName = user.getUserName();
  151. }
  152. }
  153. }
  154. if(!interruptCheck){
  155. //查询场景是否业务授权
  156. JySceneAuth jySceneAuth = jySceneAuthService.getByNum(num);
  157. if(!Objects.isNull(jySceneAuth) && jySceneAuth.getAuthType() == 0){
  158. //业务授权校验用户名密码
  159. userName = (String) params.get("userName");
  160. String password = (String) params.get("password");
  161. if(StrUtil.isEmpty(userName) || StrUtil.isEmpty(password)){
  162. throw new BusinessException(ErrorCode.USERNAME_PASSWORD_REQUIRE);
  163. }
  164. //查询用户
  165. JyUser jyUser = jyUserService.getByJyNo(userName);
  166. if(Objects.isNull(jyUser)){
  167. throw new BusinessException(ErrorCode.PASSWORD_ERROR);
  168. }
  169. JySceneUserAuth jySceneUserAuth = jySceneUserAuthService.getSceneViewAuth(num, jyUser.getId());
  170. if(Objects.isNull(jySceneUserAuth)){
  171. throw new BusinessException(ErrorCode.AUTH_FAIL.code(), "无权访问");
  172. }
  173. if (jySceneUserAuth.getLookAuth() == 2 && jySceneUserAuth.getLookEndTime().before(Calendar.getInstance().getTime())){
  174. throw new BusinessException(ErrorCode.AUTH_FAIL.code(), "超出访问截止时间");
  175. }
  176. //如果授权校验通过,校验密码是否正确
  177. User user = userService.findByUserName(userName);
  178. if(Objects.isNull(user)){
  179. throw new BusinessException(ErrorCode.PASSWORD_ERROR);
  180. }
  181. //模拟前端密码加密规则生成前端密码
  182. password = SecurityUtil.MD5(Base64Converter.decode(password));
  183. //数据库密码比对
  184. if(Objects.isNull(user) || !password.equals(user.getPassword())){
  185. throw new BusinessException(ErrorCode.PASSWORD_ERROR);
  186. }
  187. }
  188. }
  189. }catch (BusinessException e){
  190. //写入日志
  191. sysLog.setUserName(userName);
  192. sysLog.setResult(e.getMessage());
  193. sysLogService.save(sysLog);
  194. throw e;
  195. }
  196. //写入日志
  197. sysLog.setUserName(userName);
  198. sysLog.setResult(ServerCode.SUCCESS.message());
  199. sysLogService.save(sysLog);
  200. }
  201. }