StringBufferContentAspect.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. package com.ydtech.aop;
  2. import com.ydtech.modules.admin.constants.DataPermissionsEnum;
  3. import com.ydtech.modules.admin.dao.DataPermissionsMapper;
  4. import com.ydtech.modules.admin.model.DataPermissions;
  5. import com.ydtech.modules.admin.model.InsRoleMenuPermissions;
  6. import com.ydtech.modules.admin.model.InsRolePermissions;
  7. import com.ydtech.modules.admin.model.SysUser;
  8. import com.ydtech.modules.admin.model.dto.InsRoleMenuPermissionsDto;
  9. import com.ydtech.modules.admin.model.dto.InsRolePermissionsDto;
  10. import com.ydtech.modules.admin.model.vo.DataPermissionsVo;
  11. import com.ydtech.modules.admin.service.DataPermissionsService;
  12. import com.ydtech.modules.admin.service.InsRoleMenuPermissionsService;
  13. import com.ydtech.modules.admin.service.InsRolePermissionsService;
  14. import com.ydtech.modules.admin.utils.DataParams;
  15. import com.ydtech.modules.base.controller.BaseController;
  16. import com.ydtech.modules.inv.model.vo.InvAccountQueryVo;
  17. import org.aspectj.lang.ProceedingJoinPoint;
  18. import org.aspectj.lang.annotation.Around;
  19. import org.aspectj.lang.annotation.Aspect;
  20. import org.aspectj.lang.annotation.Pointcut;
  21. import org.springframework.beans.factory.annotation.Autowired;
  22. import org.springframework.stereotype.Component;
  23. import org.springframework.web.context.request.RequestContextHolder;
  24. import org.springframework.web.context.request.ServletRequestAttributes;
  25. import javax.servlet.http.HttpServletRequest;
  26. import java.net.URI;
  27. import java.util.ArrayList;
  28. import java.util.HashMap;
  29. import java.util.List;
  30. import java.util.Map;
  31. import java.util.stream.Collectors;
  32. @Aspect
  33. @Component
  34. public class StringBufferContentAspect {
  35. @Autowired
  36. private HttpServletRequest request;
  37. @Autowired
  38. private DataPermissionsMapper dataPermissionsMapper;
  39. @Autowired
  40. private InsRoleMenuPermissionsService insRoleMenuPermissionsService;
  41. @Autowired
  42. private InsRolePermissionsService insRolePermissionsService;
  43. @Autowired
  44. private DataPermissionsService dataPermissionsService;
  45. @Pointcut("@annotation(GetStringBufferContent)")
  46. public void getStringBufferContentPointcut() {
  47. }
  48. @Around("getStringBufferContentPointcut()")
  49. public Object aroundGetStringBufferContent(ProceedingJoinPoint joinPoint) throws Throwable {
  50. // 获取HttpServletRequest并添加空指针检查(这里假设已经在Spring配置中正确注入了HttpServletRequest,实际可能需要进一步处理注入问题)
  51. ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
  52. if (attributes == null) {
  53. throw new IllegalStateException("无法获取ServletRequestAttributes");
  54. }
  55. HttpServletRequest request = attributes.getRequest();
  56. if (request == null) {
  57. throw new IllegalStateException("无法获取HttpServletRequest");
  58. }
  59. String string = request.getRequestURL().toString();
  60. URI uri = new URI(string);
  61. String path = uri.getPath();
  62. DataParams invAccountQueryVo = (DataParams) joinPoint.getArgs()[0];
  63. // 假设这里通过某种业务逻辑生成了stringBufferContent的值
  64. this.buildStringBufferBasedOnDataPermissions(path, invAccountQueryVo);
  65. // 继续执行被注解标注的方法或类的原有逻辑e
  66. return joinPoint.proceed();
  67. }
  68. private void buildStringBufferBasedOnDataPermissions(String path, DataParams invAccountQueryVo) {
  69. StringBuilder stringBuffer = new StringBuilder();
  70. List<DataPermissions> operatorList = dataPermissionsMapper.getByPath(path);
  71. List<DataPermissions> cheList = this.checkData(operatorList);
  72. if(!cheList.isEmpty()){
  73. Map<String, List<DataPermissions>> groupedMap = cheList.stream()
  74. .collect(Collectors.groupingBy(DataPermissions::getRuleField));
  75. if (operatorList.size() == 1) {
  76. handleSingleDataPermission(cheList.get(0), stringBuffer, invAccountQueryVo);
  77. } else {
  78. handleMultipleDataPermissions(groupedMap, stringBuffer, invAccountQueryVo);
  79. }
  80. }
  81. }
  82. /**
  83. * @param operatorList
  84. * @return 校验数据
  85. */
  86. private List<DataPermissions> checkData(List<DataPermissions> operatorList) {
  87. SysUser user = BaseController.getUser();
  88. String roleId = user.getRoleId(); // 角色id
  89. // 提取该接口配置的菜单id列表,去重
  90. List<String> menuIdList = operatorList.stream()
  91. .map(DataPermissions::getMenuId)
  92. .distinct()
  93. .collect(Collectors.toList());
  94. if (menuIdList.isEmpty()) {
  95. // 如果没有配置菜单,直接返回空的DataPermissions列表
  96. return new ArrayList<DataPermissions>();
  97. }
  98. // 创建用于查询角色菜单权限的对象,在循环中只需设置具体属性即可
  99. InsRoleMenuPermissionsDto insRoleMenuPermissionsDto = new InsRoleMenuPermissionsDto();
  100. insRoleMenuPermissionsDto.setRoleId(roleId);
  101. // 创建用于查询角色权限的对象,同样在循环中设置具体属性
  102. InsRolePermissionsDto insRolePermissionsDto = new InsRolePermissionsDto();
  103. insRolePermissionsDto.setRoleId(roleId);
  104. for (String menuId : menuIdList) {
  105. // 设置当前循环中菜单id到相应查询对象中
  106. insRoleMenuPermissionsDto.setMenuId(menuId);
  107. insRolePermissionsDto.setMenuId(menuId);
  108. // 通过角色id和菜单id查询是否配置了该菜单权限
  109. List<InsRoleMenuPermissionsDto> roleMenuPermissionsList = insRoleMenuPermissionsService.getRoleMenuPermissionsList(insRoleMenuPermissionsDto);
  110. if (!roleMenuPermissionsList.isEmpty()) {
  111. // 如果存在该菜单权限,则查询该角色下的权限规则有哪些
  112. List<InsRolePermissions> InsRolePermissionsServiceList = insRolePermissionsService.getInsRolePermissionsServiceList(insRolePermissionsDto);
  113. if (!InsRolePermissionsServiceList.isEmpty()) {
  114. List<String> permissionsList = InsRolePermissionsServiceList.stream()
  115. .map(InsRolePermissions::getPermissionsId)
  116. .collect(Collectors.toList());
  117. DataPermissionsVo dataPermissionsVo = new DataPermissionsVo();
  118. dataPermissionsVo.setPermissionsList(permissionsList);
  119. // 执行查询并返回结果,一旦找到符合条件的权限并查询到对应数据权限,直接返回
  120. return dataPermissionsService.queryList(dataPermissionsVo);
  121. }
  122. }
  123. }
  124. // 如果遍历完所有菜单都没有符合条件的权限,返回空的DataPermissions列表
  125. return new ArrayList<DataPermissions>();
  126. }
  127. private void handleSingleDataPermission(DataPermissions dataPermissions, StringBuilder stringBuffer,
  128. DataParams invAccountQueryVo) {
  129. HashMap<String, String> sqlMap = new HashMap<>();
  130. String ruleCondition = dataPermissions.getRuleCondition();
  131. String descByCode = DataPermissionsEnum.getDescByCode(ruleCondition);
  132. String ruleField = dataPermissions.getRuleField();
  133. String ruleValue = dataPermissions.getRuleValue();
  134. sqlMap.put(ruleField, ruleValue);
  135. buildStringBuffer(stringBuffer, ruleField, descByCode, ruleValue);
  136. invAccountQueryVo.setStringBufferContent(stringBuffer.toString());
  137. invAccountQueryVo.setStringBufferContentMap(sqlMap);
  138. }
  139. private void handleMultipleDataPermissions(Map<String, List<DataPermissions>> groupedMap, StringBuilder stringBuffer, DataParams invAccountQueryVo) {
  140. HashMap<String, String> sqlMap = new HashMap<>();
  141. for (Map.Entry<String, List<DataPermissions>> entry : groupedMap.entrySet()) {
  142. List<DataPermissions> dataPermissionsList = entry.getValue();
  143. int index = 0;
  144. for (DataPermissions dataPermissions : dataPermissionsList) {
  145. String ruleCondition = dataPermissions.getRuleCondition();
  146. String descByCode = DataPermissionsEnum.getDescByCode(ruleCondition);
  147. String ruleField = dataPermissions.getRuleField();
  148. String ruleValue = dataPermissions.getRuleValue();
  149. StringBuilder stringBuilder = new StringBuilder();
  150. if(ruleValue.contains(",")){
  151. String[] split = ruleValue.split(",");
  152. int indexNumber =0;
  153. for (String s : split) {
  154. stringBuilder.append("'").append(s).append("'").append(",");
  155. indexNumber++;
  156. }
  157. stringBuilder.deleteCharAt(stringBuilder.length() - 1);
  158. ruleValue =stringBuilder.toString();
  159. }
  160. if (index >= 1) {
  161. sqlMap.put(ruleField + index, ruleValue);
  162. } else {
  163. sqlMap.put(ruleField, ruleValue);
  164. }
  165. buildStringBuffer(stringBuffer, ruleField, descByCode, ruleValue, index);
  166. index++;
  167. }
  168. }
  169. invAccountQueryVo.setStringBufferContent(stringBuffer.toString());
  170. }
  171. private void buildStringBuffer(StringBuilder stringBuffer, String ruleField, String descByCode, String ruleValue) {
  172. buildStringBuffer(stringBuffer, ruleField, descByCode, ruleValue, 0);
  173. }
  174. private void buildStringBuffer(StringBuilder stringBuffer, String ruleField, String descByCode, String ruleValue, int index) {
  175. // 根据索引构建用于从map取值的键
  176. String mapValueKey = index >= 1 ? ruleField + index : ruleField;
  177. // 构建公共的SQL语句前缀部分
  178. String commonSqlPrefix = String.format(" and %s %s", ruleField, descByCode);
  179. String sqlFragment;
  180. if (descByCode.contains("in")) {
  181. if(!ruleValue.contains(",")){
  182. sqlFragment = commonSqlPrefix + " ('"+ruleValue+"') ";
  183. }else {
  184. // 如果是in的情况,添加括号包裹map取值部分
  185. sqlFragment = commonSqlPrefix + " ("+ruleValue+") ";
  186. }
  187. } else {
  188. // 其他情况直接拼接map取值部分
  189. sqlFragment = commonSqlPrefix + " '"+ruleValue+"' ";
  190. }
  191. stringBuffer.append(sqlFragment);
  192. }
  193. }