AuthAop.java 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. package cn.cslg.pas.common.auth;
  2. import cn.cslg.pas.common.DataSource;
  3. import cn.cslg.pas.common.model.cronModel.PersonnelVO;
  4. import cn.cslg.pas.common.utils.CacheUtils;
  5. import cn.cslg.pas.common.utils.LoginUtils;
  6. import cn.cslg.pas.common.utils.Response;
  7. import com.alibaba.fastjson.JSON;
  8. import com.alibaba.fastjson.JSONArray;
  9. import com.alibaba.fastjson.JSONObject;
  10. import io.swagger.v3.oas.annotations.Operation;
  11. import okhttp3.FormBody;
  12. import okhttp3.OkHttpClient;
  13. import okhttp3.Request;
  14. import okhttp3.RequestBody;
  15. import org.aspectj.lang.JoinPoint;
  16. import org.aspectj.lang.ProceedingJoinPoint;
  17. import org.aspectj.lang.annotation.Around;
  18. import org.aspectj.lang.annotation.Aspect;
  19. import org.aspectj.lang.annotation.Before;
  20. import org.aspectj.lang.annotation.Pointcut;
  21. import org.aspectj.lang.reflect.MethodSignature;
  22. import org.springframework.beans.factory.annotation.Autowired;
  23. import org.springframework.beans.factory.annotation.Value;
  24. import org.springframework.core.annotation.Order;
  25. import org.springframework.stereotype.Component;
  26. import javax.script.ScriptEngine;
  27. import javax.script.ScriptEngineManager;
  28. import java.lang.reflect.Method;
  29. import java.util.List;
  30. import java.util.Objects;
  31. import static cn.cslg.pas.common.utils.JsonUtils.log;
  32. @Order(2)
  33. @Aspect
  34. @Component
  35. public class AuthAop {
  36. @Value("${authorUrl}")
  37. private String url;
  38. @Autowired
  39. private CacheUtils cacheUtils;
  40. @Autowired
  41. private LoginUtils loginUtils;
  42. /**
  43. * 定义切点
  44. */
  45. @Pointcut("@annotation(cn.cslg.pas.common.auth.checkAuth)")
  46. public void annotationPointcut() {
  47. }
  48. /**
  49. * @param joinPoint 当前执行的方法
  50. */
  51. @Around("annotationPointcut()")
  52. public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
  53. try {
  54. //获得登录人信息
  55. PersonnelVO personnelVO = cacheUtils.getLoginUserPersonnel(loginUtils.getId());
  56. if (personnelVO.getState() == 0) {
  57. return Response.error("登录账号已被禁用,请联系管理员启用");
  58. }
  59. // 是否通过切面过滤标记
  60. Boolean isPass = true;
  61. MethodSignature ms = (MethodSignature) joinPoint.getSignature();
  62. //获得执行方法对象
  63. Method method = ms.getMethod();
  64. //获得执行方法对象上的@checkAuth,@Operation注解对象
  65. checkAuth myAnnotation = method.getAnnotation(checkAuth.class);
  66. Operation operAnnotation = method.getAnnotation(Operation.class);
  67. //获得@checkAuth注解上FunId参数的值
  68. String functionId = myAnnotation.FunId();
  69. //获得执行方法的参数对象
  70. Object[] args = joinPoint.getArgs();
  71. //根据登录人的id以及功能id获得规则信息
  72. //将登录人的id以及功能id放入requestBody中
  73. RequestBody requestBody = new FormBody.Builder()
  74. .add("loginId", loginUtils.getId().toString())
  75. .add("functionId", functionId)
  76. .build();
  77. //建立远程连接
  78. OkHttpClient okHttpClient = new OkHttpClient();
  79. //发送请求
  80. Request request = new Request.Builder()
  81. .url(url + "/permission/api/data/queryDataRule")
  82. .addHeader("Cookie", LoginUtils.getToken())
  83. .post(requestBody)
  84. .build();
  85. //获得请求结果
  86. String resBody = Objects.requireNonNull(okHttpClient.newCall(request).execute().body()).string();
  87. JSONArray jsonArray = JSONArray.parseArray(resBody);
  88. //如果获得规则的返回值为[-1]则代表登录人没有使用该功能的权限
  89. if (jsonArray.get(0).toString().equals("-1")) {
  90. return Response.noPermissions("没有" + operAnnotation.summary() + "的功能");
  91. }
  92. //如果获得规则的返回值为[0],则直接通过判断
  93. else if (jsonArray.size() == 1 && jsonArray.get(0).equals("0")) {
  94. return joinPoint.proceed();
  95. }
  96. // 如果查询结果的size大于0证明有限制逻辑
  97. if (jsonArray.size() > 0) {
  98. RequestBody reBodySource = new FormBody.Builder()
  99. .add("tableName", "local")
  100. .build();
  101. //处理jsonObject,变为(x==y)&&(z==t)的形式 ,并用js引擎进行boolean判断
  102. //建立连接去获得字典信息
  103. OkHttpClient okHttpClientSou = new OkHttpClient();
  104. //发送请求
  105. Request requestSou = new Request.Builder()
  106. .url(url + "/permission/api/data/getDataSource")
  107. .post(reBodySource)
  108. .addHeader("Cookie", LoginUtils.getToken())
  109. .build();
  110. //获得请求返回
  111. String resSource = Objects.requireNonNull(okHttpClientSou.newCall(requestSou).execute().body()).string();
  112. JSONArray jsonArray1 = JSON.parseArray(resSource);
  113. // 获得字典
  114. List<DataSource> dataSources = jsonArray1.toJavaList(DataSource.class);
  115. //循环遍历将多个规则拼接起来
  116. StringBuilder sqlStr = new StringBuilder();
  117. for (int i = 0; i < jsonArray.size(); i++) {
  118. //将数据库里存的规则转换为可识别的判断逻辑
  119. String sql = TreeUtils.reCompute(JSONObject.parseObject(jsonArray.get(i).toString()), args, dataSources, personnelVO);
  120. sqlStr.append(jsonArray.size() != i + 1 ? sql + " || " : sql);
  121. }
  122. //js引擎进行判断
  123. ScriptEngineManager manager = new ScriptEngineManager();
  124. //根据名字获得引擎
  125. ScriptEngine engine = manager.getEngineByName("javascript");
  126. //进行判断,生成判断结果并将判断结果赋给isPass
  127. Object result = engine.eval(sqlStr.toString());//进行判断
  128. isPass = (Boolean) result;
  129. }
  130. //判断不通过
  131. if (!isPass) {
  132. return Response.noPermissions("没有权限进行" + operAnnotation.summary() + "的操作");
  133. }
  134. //判断通过
  135. return joinPoint.proceed();
  136. }
  137. catch (Exception var10) {
  138. log.error("operlog exception:{}", var10);
  139. return joinPoint.proceed();
  140. }
  141. }
  142. @Before(value = "annotationPointcut()")
  143. public void doAfterReturning(JoinPoint joinPoint) {
  144. this.handleAfterLog(joinPoint);
  145. }
  146. protected void handleAfterLog(JoinPoint joinPoint) {
  147. try {
  148. log.info("after ----> title:{}, desc:{}",1,2);
  149. return;
  150. } catch (Exception var10) {
  151. log.error("operlog exception:{}", var10);
  152. return;
  153. }
  154. }
  155. }