You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

74 lines
2.2 KiB

7 months ago
7 months ago
4 months ago
7 months ago
7 months ago
  1. package com.gaotao.common.aspect;
  2. import com.gaotao.common.annotation.DataScope;
  3. import com.gaotao.common.utils.StringUtils;
  4. import com.gaotao.core.domain.BaseEntity;
  5. import com.gaotao.modules.sys.entity.SysUserEntity;
  6. import org.apache.shiro.SecurityUtils;
  7. import org.aspectj.lang.JoinPoint;
  8. import org.aspectj.lang.annotation.Aspect;
  9. import org.aspectj.lang.annotation.Before;
  10. import org.springframework.stereotype.Component;
  11. /**
  12. * 数据过滤处理
  13. */
  14. @Aspect
  15. @Component
  16. public class DataScopeAspect {
  17. /**
  18. * 数据权限过滤关键字
  19. */
  20. public static final String DATA_SCOPE = "dataScope";
  21. @Before("@annotation(dataScope)")
  22. public void doBefore(JoinPoint joinPoint, DataScope dataScope) {
  23. clearDataScope(joinPoint);
  24. handleDataScope(joinPoint, dataScope);
  25. }
  26. protected void handleDataScope(final JoinPoint joinPoint, DataScope dataScope)
  27. {
  28. //获取当前登录用户部门id
  29. SysUserEntity currentUser = (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
  30. String site = currentUser.getSite();
  31. StringBuilder sqlString = new StringBuilder();
  32. if(currentUser.isAdmin()){
  33. return;
  34. }
  35. //判断参数类型,分别处理,部门分类
  36. if (StringUtils.isNotEmpty(dataScope.deptAlias())) {
  37. sqlString.append("CHARINDEX(" + dataScope.deptAlias() + ".site, '" + site + "')>0");
  38. }
  39. //判断参数类型,分别处理,用户分类
  40. if (StringUtils.isNotBlank(sqlString.toString()))
  41. {
  42. Object params = joinPoint.getArgs()[0];
  43. if (StringUtils.isNotNull(params) && params instanceof BaseEntity)
  44. {
  45. BaseEntity baseEntity = (BaseEntity) params;
  46. baseEntity.getParams().put(DATA_SCOPE, " AND (" + sqlString + ")");
  47. }
  48. }
  49. }
  50. /**
  51. * 拼接权限sql前先清空params.dataScope参数防止注入
  52. */
  53. private void clearDataScope(final JoinPoint joinPoint)
  54. {
  55. Object params = joinPoint.getArgs()[0];
  56. if (StringUtils.isNotNull(params) && params instanceof BaseEntity)
  57. {
  58. BaseEntity baseEntity = (BaseEntity) params;
  59. baseEntity.getParams().put(DATA_SCOPE, "");
  60. }
  61. }
  62. }