Parcourir la source

feat: 用户管理增加租户逻辑

yang kai il y a 2 ans
Parent
commit
fe876d6b4a

+ 4 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java

@@ -138,6 +138,10 @@ public class SysUserController extends BaseController
         }
         user.setCreateBy(getUsername());
         user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
+        if (getTenantId() != null) {
+            user.setTenantId(getTenantId());
+        }
+
         return toAjax(userService.insertUser(user));
     }
 

+ 6 - 0
ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java

@@ -199,4 +199,10 @@ public class BaseController
     {
         return getLoginUser().getUsername();
     }
+
+    /**
+     * 获取登录用户的租户ID
+     * @return
+     */
+    public Long getTenantId() { return getLoginUser().getTenantId(); }
 }

+ 4 - 0
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java

@@ -147,6 +147,10 @@ public class LoginUser implements UserDetails
 
     public String getUserType() { return user.getUserType(); }
 
+    public boolean isTenantAdmin() {
+        return user.isTenantAdmin();
+    }
+
     /**
      * 账户是否未过期,过期无法验证
      */

+ 9 - 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java

@@ -143,4 +143,13 @@ public class SecurityUtils
     public static boolean isTenantAdmin(String userType, Long tenantId) {
         return tenantId != null && "01".equals(userType);
     }
+
+    public static  boolean isLoginUserTenantAdmin() {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        if (loginUser == null) {
+            return false;
+        } else {
+            return loginUser.isTenantAdmin();
+        }
+    }
 }

+ 30 - 7
ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java

@@ -70,9 +70,15 @@ public class DataScopeAspect
         {
             SysUser currentUser = loginUser.getUser();
             System.out.println("currentUser isTenantAdmin: " + currentUser.isTenantAdmin());
-            // 如果是超级管理员,则不过滤数据
-            if (StringUtils.isNotNull(currentUser) && !currentUser.isAdmin())
+            if (StringUtils.isNotNull(currentUser) && currentUser.isAdmin())
             {
+                // 如果是超级管理员,则不过滤数据
+            } else if (StringUtils.isNotNull(currentUser) && currentUser.isTenantAdmin()) {
+                // 如果是租户管理员,根据租户ID过滤数据
+                tenantAdminDataScopeFilter(joinPoint, currentUser, controllerDataScope.deptAlias(),
+                        controllerDataScope.userAlias());
+            } else {
+                // 根据数据权限过滤数据
                 String permission = StringUtils.defaultIfEmpty(controllerDataScope.permission(), PermissionContextHolder.getContext());
                 dataScopeFilter(joinPoint, currentUser, controllerDataScope.deptAlias(),
                         controllerDataScope.userAlias(), permission);
@@ -80,6 +86,28 @@ public class DataScopeAspect
         }
     }
 
+    public static void tenantAdminDataScopeFilter(JoinPoint joinPoint, SysUser user, String deptAlias, String userAlias) {
+        StringBuilder sqlString = new StringBuilder();
+        Object params = joinPoint.getArgs()[0];
+
+        if (StringUtils.isNotBlank(userAlias)) // 根据用户表的租户ID过滤
+        {
+            sqlString.append(StringUtils.format(" OR {}.tenant_id = {} ", userAlias, user.getTenantId()));
+        }
+        else // 根据部门表的租户ID过滤
+        {
+            sqlString.append(StringUtils.format(" OR {}.tenant_id = {} ", deptAlias, user.getTenantId()));
+        }
+
+
+
+        if (StringUtils.isNotNull(params) && params instanceof BaseEntity)
+        {
+            BaseEntity baseEntity = (BaseEntity) params;
+            baseEntity.getParams().put(DATA_SCOPE, " AND (" + sqlString.substring(4) + ")");
+        }
+    }
+
     /**
      * 数据范围过滤
      *
@@ -149,11 +177,6 @@ public class DataScopeAspect
             sqlString.append(StringUtils.format(" OR {}.dept_id = 0 ", deptAlias));
         }
 
-        // 租户管理员情况下,根据租户ID过滤数据
-        if (user.isTenantAdmin()) {
-            sqlString.append(StringUtils.format(" OR {}.tenant_id = {} ", deptAlias, user.getTenantId()));
-        }
-
         if (StringUtils.isNotBlank(sqlString.toString()))
         {
             Object params = joinPoint.getArgs()[0];

+ 2 - 0
ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml

@@ -168,6 +168,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  			<if test="status != null and status != ''">status,</if>
  			<if test="createBy != null and createBy != ''">create_by,</if>
  			<if test="remark != null and remark != ''">remark,</if>
+		    <if test="tenantId != null and tenantId != 0">tenant_id,</if>
  			create_time
  		)values(
  			<if test="userId != null and userId != ''">#{userId},</if>
@@ -182,6 +183,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  			<if test="status != null and status != ''">#{status},</if>
  			<if test="createBy != null and createBy != ''">#{createBy},</if>
  			<if test="remark != null and remark != ''">#{remark},</if>
+		    <if test="tenantId != null">#{tenantId},</if>
  			sysdate()
  		)
 	</insert>