|
@@ -0,0 +1,108 @@
|
|
|
+package com.lantone.security.aop;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
+import com.google.common.collect.Lists;
|
|
|
+import com.lantone.common.constant.AuthConstant;
|
|
|
+import com.lantone.common.enums.IsDeleteEnum;
|
|
|
+import com.lantone.common.exception.Asserts;
|
|
|
+import com.lantone.common.util.ListUtil;
|
|
|
+import com.lantone.common.util.SysUserUtils;
|
|
|
+import com.lantone.common.vo.base.BasePageVo;
|
|
|
+import com.lantone.common.vo.base.BaseVo;
|
|
|
+import com.lantone.dblayermbg.entity.UserRole;
|
|
|
+import com.lantone.dblayermbg.facade.UserRoleFacade;
|
|
|
+import com.lantone.security.annotation.DataAuthFilter;
|
|
|
+import org.apache.commons.lang.StringUtils;
|
|
|
+import org.aspectj.lang.JoinPoint;
|
|
|
+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.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+
|
|
|
+import java.util.List;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @Description:数据权限过滤处理切面
|
|
|
+ * @Author songxl
|
|
|
+ * @Date 2021/8/25
|
|
|
+ */
|
|
|
+@Aspect
|
|
|
+@Component
|
|
|
+public class DataAuthFilterAspect {
|
|
|
+ @Autowired
|
|
|
+ private UserRoleFacade userRoleFacade;
|
|
|
+
|
|
|
+ //切入点
|
|
|
+ @Pointcut("@annotation(com.lantone.security.annotation.DataAuthFilter)")
|
|
|
+ public void dataFilterCut() {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Before("dataFilterCut()")
|
|
|
+ public void dataFilter(JoinPoint point) {
|
|
|
+ Object params = point.getArgs()[0];
|
|
|
+ if (params != null) {
|
|
|
+ //获取当前用户角色集合如果是超级管理员则不进行数据过滤
|
|
|
+ List<Long> roleIds = userRoleFacade.list(new QueryWrapper<UserRole>()
|
|
|
+ .eq("user_id", SysUserUtils.getCurrentPrincipleId())
|
|
|
+ .eq("is_deleted", IsDeleteEnum.N.getKey())).stream().map(UserRole::getRoleId).collect(Collectors.toList());
|
|
|
+ if (!roleIds.contains(AuthConstant.SUPPER_ADMIN)) {
|
|
|
+ if (params instanceof BaseVo){
|
|
|
+ BaseVo vo = (BaseVo) params;
|
|
|
+ vo.getMap().put(AuthConstant.DATAAUTH_FILTER_SQL, getSQLFilter(point));
|
|
|
+ }
|
|
|
+ if (params instanceof BasePageVo){
|
|
|
+ BasePageVo vo = (BasePageVo) params;
|
|
|
+ vo.getMap().put(AuthConstant.DATAAUTH_FILTER_SQL, getSQLFilter(point));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return;
|
|
|
+ } else {
|
|
|
+ Asserts.fail("数据权限接口,只能是Map类型参数,且不能为NULL");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @param point
|
|
|
+ * @Description获取数据过滤的SQL
|
|
|
+ * @Return java.lang.String
|
|
|
+ */
|
|
|
+ private String getSQLFilter(JoinPoint point) {
|
|
|
+
|
|
|
+ MethodSignature signature = (MethodSignature) point.getSignature();
|
|
|
+ DataAuthFilter dataAuthFilter = signature.getMethod().getAnnotation(DataAuthFilter.class);
|
|
|
+ //###模拟数据
|
|
|
+ List<String> users = Lists.newArrayList("1", "2");
|
|
|
+ List<String> depts = Lists.newArrayList("16", "34");
|
|
|
+ List<String> hopitals = Lists.newArrayList("1", "2");
|
|
|
+
|
|
|
+
|
|
|
+ StringBuilder sqlFilter = new StringBuilder();
|
|
|
+ sqlFilter.append(" (");
|
|
|
+
|
|
|
+ //sql拼接
|
|
|
+ //1.用户
|
|
|
+ if (StringUtils.isNotEmpty(dataAuthFilter.userAlias()) && ListUtil.isNotEmpty(users)) {
|
|
|
+ sqlFilter.append(dataAuthFilter.userAlias()).append(" in(").append(StringUtils.join(depts, ",")).append(")");
|
|
|
+ }
|
|
|
+ //2.科室
|
|
|
+ if (StringUtils.isNotEmpty(dataAuthFilter.deptAlias()) && ListUtil.isNotEmpty(depts)) {
|
|
|
+ sqlFilter.append(dataAuthFilter.deptAlias()).append(" in(").append(StringUtils.join(depts, ",")).append(")");
|
|
|
+ }
|
|
|
+ //3.组织
|
|
|
+ if (StringUtils.isNotEmpty(dataAuthFilter.hospitalAlias()) && ListUtil.isNotEmpty(hopitals)) {
|
|
|
+ sqlFilter.append(dataAuthFilter.hospitalAlias()).append(" in(").append(StringUtils.join(depts, ",")).append(")");
|
|
|
+ }
|
|
|
+
|
|
|
+ sqlFilter.append(") ");
|
|
|
+
|
|
|
+ if (sqlFilter.toString().trim().equals("()")) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ return sqlFilter.toString();
|
|
|
+ }
|
|
|
+}
|