mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-10-30 09:48:43 +08:00 
			
		
		
		
	去除 LoginUser 的 roleIds、deptId 字段,简化
This commit is contained in:
		| @@ -1,11 +1,13 @@ | ||||
| package cn.iocoder.yudao.framework.datapermission.core.dept.rule; | ||||
|  | ||||
| import cn.hutool.core.collection.CollUtil; | ||||
| import cn.hutool.core.util.ObjectUtil; | ||||
| import cn.hutool.core.util.StrUtil; | ||||
| import cn.iocoder.yudao.framework.datapermission.core.dept.service.DeptDataPermissionFrameworkService; | ||||
| import cn.iocoder.yudao.framework.datapermission.core.dept.service.dto.DeptDataPermissionRespDTO; | ||||
| import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; | ||||
| import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | ||||
| import cn.iocoder.yudao.framework.common.util.json.JsonUtils; | ||||
| import cn.iocoder.yudao.framework.datapermission.core.dept.service.DeptDataPermissionFrameworkService; | ||||
| import cn.iocoder.yudao.framework.datapermission.core.dept.service.dto.DeptDataPermissionRespDTO; | ||||
| import cn.iocoder.yudao.framework.datapermission.core.rule.DataPermissionRule; | ||||
| import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; | ||||
| import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils; | ||||
| @@ -13,7 +15,6 @@ import cn.iocoder.yudao.framework.security.core.LoginUser; | ||||
| import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; | ||||
| import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; | ||||
| import lombok.AllArgsConstructor; | ||||
| import lombok.Getter; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import net.sf.jsqlparser.expression.Alias; | ||||
| import net.sf.jsqlparser.expression.Expression; | ||||
| @@ -24,10 +25,7 @@ import net.sf.jsqlparser.expression.operators.relational.EqualsTo; | ||||
| import net.sf.jsqlparser.expression.operators.relational.ExpressionList; | ||||
| import net.sf.jsqlparser.expression.operators.relational.InExpression; | ||||
|  | ||||
| import java.util.HashMap; | ||||
| import java.util.HashSet; | ||||
| import java.util.Map; | ||||
| import java.util.Set; | ||||
| import java.util.*; | ||||
|  | ||||
| /** | ||||
|  * 基于部门的 {@link DataPermissionRule} 数据权限规则实现 | ||||
| @@ -50,6 +48,11 @@ import java.util.Set; | ||||
| @Slf4j | ||||
| public class DeptDataPermissionRule implements DataPermissionRule { | ||||
|  | ||||
|     /** | ||||
|      * LoginUser 的 Context 缓存 Key | ||||
|      */ | ||||
|     protected static final String CONTEXT_KEY = DeptDataPermissionRule.class.getSimpleName(); | ||||
|  | ||||
|     private static final String DEPT_COLUMN_NAME = "dept_id"; | ||||
|     private static final String USER_COLUMN_NAME = "user_id"; | ||||
|  | ||||
| @@ -90,13 +93,23 @@ public class DeptDataPermissionRule implements DataPermissionRule { | ||||
|         if (loginUser == null) { | ||||
|             return null; | ||||
|         } | ||||
|         // 只有管理员类型的用户,才进行数据权限的处理 | ||||
|         if (ObjectUtil.notEqual(loginUser.getUserType(), UserTypeEnum.ADMIN.getValue())) { | ||||
|             return null; | ||||
|         } | ||||
|  | ||||
|         // 获得数据权限 | ||||
|         DeptDataPermissionRespDTO deptDataPermission = deptDataPermissionService.getDeptDataPermission(loginUser); | ||||
|         DeptDataPermissionRespDTO deptDataPermission = loginUser.getContext(CONTEXT_KEY, DeptDataPermissionRespDTO.class); | ||||
|         // 从上下文中拿不到,则调用逻辑进行获取 | ||||
|         if (deptDataPermission == null) { | ||||
|             log.error("[getExpression][LoginUser({}) 获取数据权限为 null]", JsonUtils.toJsonString(loginUser)); | ||||
|             throw new NullPointerException(String.format("LoginUser(%d) Table(%s/%s) 未返回数据权限", | ||||
|                     loginUser.getId(), tableName, tableAlias.getName())); | ||||
|             deptDataPermission = deptDataPermissionService.getDeptDataPermission(loginUser.getId()); | ||||
|             if (deptDataPermission == null) { | ||||
|                 log.error("[getExpression][LoginUser({}) 获取数据权限为 null]", JsonUtils.toJsonString(loginUser)); | ||||
|                 throw new NullPointerException(String.format("LoginUser(%d) Table(%s/%s) 未返回数据权限", | ||||
|                         loginUser.getId(), tableName, tableAlias.getName())); | ||||
|             } | ||||
|             // 添加到上下文中,避免重复计算 | ||||
|             loginUser.setContext(CONTEXT_KEY, deptDataPermission); | ||||
|         } | ||||
|  | ||||
|         // 情况一,如果是 ALL 可查看全部,则无需拼接条件 | ||||
| @@ -111,8 +124,8 @@ public class DeptDataPermissionRule implements DataPermissionRule { | ||||
|         } | ||||
|  | ||||
|         // 情况三,拼接 Dept 和 User 的条件,最后组合 | ||||
|         Expression deptExpression = this.buildDeptExpression(tableName,tableAlias, deptDataPermission.getDeptIds()); | ||||
|         Expression userExpression = this.buildUserExpression(tableName, tableAlias, deptDataPermission.getSelf(), loginUser.getId()); | ||||
|         Expression deptExpression = buildDeptExpression(tableName,tableAlias, deptDataPermission.getDeptIds()); | ||||
|         Expression userExpression = buildUserExpression(tableName, tableAlias, deptDataPermission.getSelf(), loginUser.getId()); | ||||
|         if (deptExpression == null && userExpression == null) { | ||||
|             // TODO 芋艿:获得不到条件的时候,暂时不抛出异常,而是不返回数据 | ||||
|             log.warn("[getExpression][LoginUser({}) Table({}/{}) DeptDataPermission({}) 构建的条件为空]", | ||||
|   | ||||
| @@ -1,7 +1,6 @@ | ||||
| package cn.iocoder.yudao.framework.datapermission.core.dept.service; | ||||
|  | ||||
| import cn.iocoder.yudao.framework.datapermission.core.dept.service.dto.DeptDataPermissionRespDTO; | ||||
| import cn.iocoder.yudao.framework.security.core.LoginUser; | ||||
|  | ||||
| /** | ||||
|  * 基于部门的数据权限 Framework Service 接口 | ||||
| @@ -14,9 +13,9 @@ public interface DeptDataPermissionFrameworkService { | ||||
|     /** | ||||
|      * 获得登陆用户的部门数据权限 | ||||
|      * | ||||
|      * @param loginUser 登陆用户 | ||||
|      * @param userId 用户编号 | ||||
|      * @return 部门数据权限 | ||||
|      */ | ||||
|     DeptDataPermissionRespDTO getDeptDataPermission(LoginUser loginUser); | ||||
|     DeptDataPermissionRespDTO getDeptDataPermission(Long userId); | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -2,6 +2,7 @@ package cn.iocoder.yudao.framework.datapermission.core.dept.rule; | ||||
|  | ||||
| import cn.hutool.core.collection.CollUtil; | ||||
| import cn.hutool.core.util.ReflectUtil; | ||||
| import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; | ||||
| import cn.iocoder.yudao.framework.common.util.collection.SetUtils; | ||||
| import cn.iocoder.yudao.framework.datapermission.core.dept.service.DeptDataPermissionFrameworkService; | ||||
| import cn.iocoder.yudao.framework.datapermission.core.dept.service.dto.DeptDataPermissionRespDTO; | ||||
| @@ -69,7 +70,8 @@ class DeptDataPermissionRuleTest extends BaseMockitoUnitTest { | ||||
|             String tableName = "t_user"; | ||||
|             Alias tableAlias = new Alias("u"); | ||||
|             // mock 方法 | ||||
|             LoginUser loginUser = randomPojo(LoginUser.class, o -> o.setId(1L)); | ||||
|             LoginUser loginUser = randomPojo(LoginUser.class, o -> o.setId(1L) | ||||
|                     .setUserType(UserTypeEnum.ADMIN.getValue())); | ||||
|             securityFrameworkUtilsMock.when(SecurityFrameworkUtils::getLoginUser).thenReturn(loginUser); | ||||
|  | ||||
|             // 调用 | ||||
| @@ -88,16 +90,18 @@ class DeptDataPermissionRuleTest extends BaseMockitoUnitTest { | ||||
|             String tableName = "t_user"; | ||||
|             Alias tableAlias = new Alias("u"); | ||||
|             // mock 方法(LoginUser) | ||||
|             LoginUser loginUser = randomPojo(LoginUser.class, o -> o.setId(1L)); | ||||
|             LoginUser loginUser = randomPojo(LoginUser.class, o -> o.setId(1L) | ||||
|                     .setUserType(UserTypeEnum.ADMIN.getValue())); | ||||
|             securityFrameworkUtilsMock.when(SecurityFrameworkUtils::getLoginUser).thenReturn(loginUser); | ||||
|             // mock 方法(DeptDataPermissionRespDTO) | ||||
|             DeptDataPermissionRespDTO deptDataPermission = new DeptDataPermissionRespDTO().setAll(true); | ||||
|             when(deptDataPermissionFrameworkService.getDeptDataPermission(same(loginUser))).thenReturn(deptDataPermission); | ||||
|             when(deptDataPermissionFrameworkService.getDeptDataPermission(same(1L))).thenReturn(deptDataPermission); | ||||
|  | ||||
|             // 调用 | ||||
|             Expression expression = rule.getExpression(tableName, tableAlias); | ||||
|             // 断言 | ||||
|             assertNull(expression); | ||||
|             assertSame(deptDataPermission, loginUser.getContext(DeptDataPermissionRule.CONTEXT_KEY, DeptDataPermissionRespDTO.class)); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -109,16 +113,18 @@ class DeptDataPermissionRuleTest extends BaseMockitoUnitTest { | ||||
|             String tableName = "t_user"; | ||||
|             Alias tableAlias = new Alias("u"); | ||||
|             // mock 方法(LoginUser) | ||||
|             LoginUser loginUser = randomPojo(LoginUser.class, o -> o.setId(1L)); | ||||
|             LoginUser loginUser = randomPojo(LoginUser.class, o -> o.setId(1L) | ||||
|                     .setUserType(UserTypeEnum.ADMIN.getValue())); | ||||
|             securityFrameworkUtilsMock.when(SecurityFrameworkUtils::getLoginUser).thenReturn(loginUser); | ||||
|             // mock 方法(DeptDataPermissionRespDTO) | ||||
|             DeptDataPermissionRespDTO deptDataPermission = new DeptDataPermissionRespDTO(); | ||||
|             when(deptDataPermissionFrameworkService.getDeptDataPermission(same(loginUser))).thenReturn(deptDataPermission); | ||||
|             when(deptDataPermissionFrameworkService.getDeptDataPermission(same(1L))).thenReturn(deptDataPermission); | ||||
|  | ||||
|             // 调用 | ||||
|             Expression expression = rule.getExpression(tableName, tableAlias); | ||||
|             // 断言 | ||||
|             assertEquals("null = null", expression.toString()); | ||||
|             assertSame(deptDataPermission, loginUser.getContext(DeptDataPermissionRule.CONTEXT_KEY, DeptDataPermissionRespDTO.class)); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -130,17 +136,19 @@ class DeptDataPermissionRuleTest extends BaseMockitoUnitTest { | ||||
|             String tableName = "t_user"; | ||||
|             Alias tableAlias = new Alias("u"); | ||||
|             // mock 方法(LoginUser) | ||||
|             LoginUser loginUser = randomPojo(LoginUser.class, o -> o.setId(1L)); | ||||
|             LoginUser loginUser = randomPojo(LoginUser.class, o -> o.setId(1L) | ||||
|                     .setUserType(UserTypeEnum.ADMIN.getValue())); | ||||
|             securityFrameworkUtilsMock.when(SecurityFrameworkUtils::getLoginUser).thenReturn(loginUser); | ||||
|             // mock 方法(DeptDataPermissionRespDTO) | ||||
|             DeptDataPermissionRespDTO deptDataPermission = new DeptDataPermissionRespDTO() | ||||
|                     .setDeptIds(SetUtils.asSet(10L, 20L)).setSelf(true); | ||||
|             when(deptDataPermissionFrameworkService.getDeptDataPermission(same(loginUser))).thenReturn(deptDataPermission); | ||||
|             when(deptDataPermissionFrameworkService.getDeptDataPermission(same(1L))).thenReturn(deptDataPermission); | ||||
|  | ||||
|             // 调用 | ||||
|             Expression expression = rule.getExpression(tableName, tableAlias); | ||||
|             // 断言 | ||||
|             assertSame(EXPRESSION_NULL, expression); | ||||
|             assertSame(deptDataPermission, loginUser.getContext(DeptDataPermissionRule.CONTEXT_KEY, DeptDataPermissionRespDTO.class)); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -152,12 +160,13 @@ class DeptDataPermissionRuleTest extends BaseMockitoUnitTest { | ||||
|             String tableName = "t_user"; | ||||
|             Alias tableAlias = new Alias("u"); | ||||
|             // mock 方法(LoginUser) | ||||
|             LoginUser loginUser = randomPojo(LoginUser.class, o -> o.setId(1L)); | ||||
|             LoginUser loginUser = randomPojo(LoginUser.class, o -> o.setId(1L) | ||||
|                     .setUserType(UserTypeEnum.ADMIN.getValue())); | ||||
|             securityFrameworkUtilsMock.when(SecurityFrameworkUtils::getLoginUser).thenReturn(loginUser); | ||||
|             // mock 方法(DeptDataPermissionRespDTO) | ||||
|             DeptDataPermissionRespDTO deptDataPermission = new DeptDataPermissionRespDTO() | ||||
|                     .setSelf(true); | ||||
|             when(deptDataPermissionFrameworkService.getDeptDataPermission(same(loginUser))).thenReturn(deptDataPermission); | ||||
|             when(deptDataPermissionFrameworkService.getDeptDataPermission(same(1L))).thenReturn(deptDataPermission); | ||||
|             // 添加 user 字段配置 | ||||
|             rule.addUserColumn("t_user", "id"); | ||||
|  | ||||
| @@ -165,6 +174,7 @@ class DeptDataPermissionRuleTest extends BaseMockitoUnitTest { | ||||
|             Expression expression = rule.getExpression(tableName, tableAlias); | ||||
|             // 断言 | ||||
|             assertEquals("u.id = 1", expression.toString()); | ||||
|             assertSame(deptDataPermission, loginUser.getContext(DeptDataPermissionRule.CONTEXT_KEY, DeptDataPermissionRespDTO.class)); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -176,12 +186,13 @@ class DeptDataPermissionRuleTest extends BaseMockitoUnitTest { | ||||
|             String tableName = "t_user"; | ||||
|             Alias tableAlias = new Alias("u"); | ||||
|             // mock 方法(LoginUser) | ||||
|             LoginUser loginUser = randomPojo(LoginUser.class, o -> o.setId(1L)); | ||||
|             LoginUser loginUser = randomPojo(LoginUser.class, o -> o.setId(1L) | ||||
|                     .setUserType(UserTypeEnum.ADMIN.getValue())); | ||||
|             securityFrameworkUtilsMock.when(SecurityFrameworkUtils::getLoginUser).thenReturn(loginUser); | ||||
|             // mock 方法(DeptDataPermissionRespDTO) | ||||
|             DeptDataPermissionRespDTO deptDataPermission = new DeptDataPermissionRespDTO() | ||||
|                     .setDeptIds(CollUtil.newLinkedHashSet(10L, 20L)); | ||||
|             when(deptDataPermissionFrameworkService.getDeptDataPermission(same(loginUser))).thenReturn(deptDataPermission); | ||||
|             when(deptDataPermissionFrameworkService.getDeptDataPermission(same(1L))).thenReturn(deptDataPermission); | ||||
|             // 添加 dept 字段配置 | ||||
|             rule.addDeptColumn("t_user", "dept_id"); | ||||
|  | ||||
| @@ -189,6 +200,7 @@ class DeptDataPermissionRuleTest extends BaseMockitoUnitTest { | ||||
|             Expression expression = rule.getExpression(tableName, tableAlias); | ||||
|             // 断言 | ||||
|             assertEquals("u.dept_id IN (10, 20)", expression.toString()); | ||||
|             assertSame(deptDataPermission, loginUser.getContext(DeptDataPermissionRule.CONTEXT_KEY, DeptDataPermissionRespDTO.class)); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -200,12 +212,13 @@ class DeptDataPermissionRuleTest extends BaseMockitoUnitTest { | ||||
|             String tableName = "t_user"; | ||||
|             Alias tableAlias = new Alias("u"); | ||||
|             // mock 方法(LoginUser) | ||||
|             LoginUser loginUser = randomPojo(LoginUser.class, o -> o.setId(1L)); | ||||
|             LoginUser loginUser = randomPojo(LoginUser.class, o -> o.setId(1L) | ||||
|                     .setUserType(UserTypeEnum.ADMIN.getValue())); | ||||
|             securityFrameworkUtilsMock.when(SecurityFrameworkUtils::getLoginUser).thenReturn(loginUser); | ||||
|             // mock 方法(DeptDataPermissionRespDTO) | ||||
|             DeptDataPermissionRespDTO deptDataPermission = new DeptDataPermissionRespDTO() | ||||
|                     .setDeptIds(CollUtil.newLinkedHashSet(10L, 20L)).setSelf(true); | ||||
|             when(deptDataPermissionFrameworkService.getDeptDataPermission(same(loginUser))).thenReturn(deptDataPermission); | ||||
|             when(deptDataPermissionFrameworkService.getDeptDataPermission(same(1L))).thenReturn(deptDataPermission); | ||||
|             // 添加 user 字段配置 | ||||
|             rule.addUserColumn("t_user", "id"); | ||||
|             // 添加 dept 字段配置 | ||||
| @@ -215,6 +228,7 @@ class DeptDataPermissionRuleTest extends BaseMockitoUnitTest { | ||||
|             Expression expression = rule.getExpression(tableName, tableAlias); | ||||
|             // 断言 | ||||
|             assertEquals("u.dept_id IN (10, 20) OR u.id = 1", expression.toString()); | ||||
|             assertSame(deptDataPermission, loginUser.getContext(DeptDataPermissionRule.CONTEXT_KEY, DeptDataPermissionRespDTO.class)); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 YunaiV
					YunaiV