123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- package com.bizmatics.service.aop;
- import com.baomidou.mybatisplus.core.toolkit.StringUtils;
- import com.bizmatics.common.mvc.utils.ServletUtils;
- import com.bizmatics.common.spring.util.SpringContextUtils;
- import com.bizmatics.model.base.BaseEntity;
- import com.bizmatics.model.system.SysRole;
- import com.bizmatics.model.system.SysUser;
- import com.bizmatics.service.system.impl.TokenService;
- import com.bizmatics.service.config.security.LoginUser;
- import org.aspectj.lang.JoinPoint;
- import org.aspectj.lang.Signature;
- import org.aspectj.lang.annotation.Aspect;
- import org.aspectj.lang.annotation.Before;
- import org.aspectj.lang.annotation.Pointcut;
- import org.aspectj.lang.reflect.MethodSignature;
- import org.springframework.stereotype.Component;
- import java.lang.reflect.Method;
- import java.util.Objects;
- /**
- * 数据过滤处理
- *
- * @author ruoyi
- */
- @Aspect
- @Component
- public class DataScopeAspect
- {
- /**
- * 全部数据权限
- */
- public static final String DATA_SCOPE_ALL = "1";
- /**
- * 自定数据权限
- */
- public static final String DATA_SCOPE_CUSTOM = "2";
- /**
- * 部门数据权限
- */
- public static final String DATA_SCOPE_DEPT = "3";
- /**
- * 部门及以下数据权限
- */
- public static final String DATA_SCOPE_DEPT_AND_CHILD = "4";
- /**
- * 仅本人数据权限
- */
- public static final String DATA_SCOPE_SELF = "5";
- /**
- * 数据权限过滤关键字
- */
- public static final String DATA_SCOPE = "dataScope";
- // 配置织入点
- @Pointcut("@annotation(com.bizmatics.service.aop.DataScope)")
- public void dataScopePointCut()
- {
- }
- @Before("dataScopePointCut()")
- public void doBefore(JoinPoint point) throws Throwable
- {
- clearDataScope(point);
- handleDataScope(point);
- }
- protected void handleDataScope(final JoinPoint joinPoint)
- {
- // 获得注解
- DataScope controllerDataScope = getAnnotationLog(joinPoint);
- if (controllerDataScope == null)
- {
- return;
- }
- // 获取当前的用户
- LoginUser loginUser = SpringContextUtils.getBean(TokenService.class).getLoginUser(ServletUtils.getRequest());
- if (Objects.nonNull(loginUser))
- {
- SysUser currentUser = loginUser.getUser();
- // 如果是超级管理员,则不过滤数据
- if (Objects.nonNull(currentUser) && !currentUser.isAdmin())
- {
- dataScopeFilter(joinPoint, currentUser, controllerDataScope.deptAlias(),
- controllerDataScope.userAlias());
- }
- }
- }
- /**
- * 数据范围过滤
- *
- * @param joinPoint 切点
- * @param user 用户
- * @param userAlias 别名
- */
- public static void dataScopeFilter(JoinPoint joinPoint, SysUser user, String deptAlias, String userAlias)
- {
- StringBuilder sqlString = new StringBuilder();
- for (SysRole role : user.getRoles())
- {
- String dataScope = role.getDataScope();
- if (DATA_SCOPE_ALL.equals(dataScope))
- {
- sqlString = new StringBuilder();
- break;
- }
- else if (DATA_SCOPE_CUSTOM.equals(dataScope))
- {
- sqlString.append(StringUtils.format(
- " OR {}.dept_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = {} ) ", deptAlias,
- role.getRoleId()));
- }
- else if (DATA_SCOPE_DEPT.equals(dataScope))
- {
- sqlString.append(StringUtils.format(" OR {}.dept_id = {} ", deptAlias, user.getDeptId()));
- }
- else if (DATA_SCOPE_DEPT_AND_CHILD.equals(dataScope))
- {
- sqlString.append(StringUtils.format(
- " OR {}.dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = {} or find_in_set( {} , ancestors ) )",
- deptAlias, user.getDeptId(), user.getDeptId()));
- }
- else if (DATA_SCOPE_SELF.equals(dataScope))
- {
- if (StringUtils.isNotBlank(userAlias))
- {
- sqlString.append(StringUtils.format(" OR {}.user_id = {} ", userAlias, user.getUserId()));
- }
- else
- {
- // 数据权限为仅本人且没有userAlias别名不查询任何数据
- sqlString.append(" OR 1=0 ");
- }
- }
- }
- if (StringUtils.isNotBlank(sqlString.toString()))
- {
- Object params = joinPoint.getArgs()[0];
- if (Objects.nonNull(params) && params instanceof BaseEntity)
- {
- BaseEntity baseEntity = (BaseEntity) params;
- baseEntity.getParams().put(DATA_SCOPE, " AND (" + sqlString.substring(4) + ")");
- }
- }
- }
- /**
- * 是否存在注解,如果存在就获取
- */
- private DataScope getAnnotationLog(JoinPoint joinPoint)
- {
- Signature signature = joinPoint.getSignature();
- MethodSignature methodSignature = (MethodSignature) signature;
- Method method = methodSignature.getMethod();
- if (method != null)
- {
- return method.getAnnotation(DataScope.class);
- }
- return null;
- }
- /**
- * 拼接权限sql前先清空params.dataScope参数防止注入
- */
- private void clearDataScope(final JoinPoint joinPoint)
- {
- Object params = joinPoint.getArgs()[0];
- if (Objects.nonNull(params) && params instanceof BaseEntity)
- {
- BaseEntity baseEntity = (BaseEntity) params;
- baseEntity.getParams().put(DATA_SCOPE, "");
- }
- }
- }
|