Commit 8278b65777d8249c0c1d29987f91dd39928dcf39

Authored by YunaiV
1 parent 986cb724

重构 Dept 数据权限逻辑,统一收到 yudao-spring-boot-starter-data-permission 包下

Showing 16 changed files with 196 additions and 124 deletions
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/datapermission/core/service/impl/DeptDataPermissionServiceImpl.java deleted
1 -package cn.iocoder.yudao.adminserver.framework.datapermission.core.service.impl;  
2 -  
3 -import cn.hutool.core.collection.CollUtil;  
4 -import cn.iocoder.yudao.adminserver.framework.datapermission.core.service.DeptDataPermissionService;  
5 -import cn.iocoder.yudao.adminserver.framework.datapermission.core.service.dto.DeptDataPermissionRespDTO;  
6 -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO;  
7 -import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO;  
8 -import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService;  
9 -import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysRoleService;  
10 -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;  
11 -import cn.iocoder.yudao.framework.common.util.json.JsonUtils;  
12 -import cn.iocoder.yudao.framework.security.core.LoginUser;  
13 -import cn.iocoder.yudao.framework.security.core.enums.DataScopeEnum;  
14 -import lombok.RequiredArgsConstructor;  
15 -import lombok.extern.slf4j.Slf4j;  
16 -  
17 -import java.util.List;  
18 -import java.util.Objects;  
19 -  
20 -/**  
21 - * 基于部门的数据权限 Service 实现类  
22 - *  
23 - * @author 芋道源码  
24 - */  
25 -@RequiredArgsConstructor  
26 -@Slf4j  
27 -public class DeptDataPermissionServiceImpl implements DeptDataPermissionService {  
28 -  
29 - /**  
30 - * LoginUser 的 Context 缓存 Key  
31 - */  
32 - private static final String CONTEXT_KEY = DeptDataPermissionServiceImpl.class.getSimpleName();  
33 -  
34 - private final SysRoleService roleService;  
35 - private final SysDeptService deptService;  
36 -  
37 - @Override  
38 - public DeptDataPermissionRespDTO getDeptDataPermission(LoginUser loginUser) {  
39 - // 判断是否 context 已经缓存  
40 - DeptDataPermissionRespDTO result = loginUser.getContext(CONTEXT_KEY, DeptDataPermissionRespDTO.class);  
41 - if (result != null) {  
42 - return result;  
43 - }  
44 -  
45 - // 创建 DeptDataPermissionRespDTO 对象  
46 - result = new DeptDataPermissionRespDTO();  
47 - List<SysRoleDO> roles = roleService.getRolesFromCache(loginUser.getRoleIds());  
48 - for (SysRoleDO role : roles) {  
49 - // 为空时,跳过  
50 - if (role.getDataScope() == null) {  
51 - continue;  
52 - }  
53 - // 情况一,ALL  
54 - if (Objects.equals(role.getDataScope(), DataScopeEnum.ALL.getScope())) {  
55 - result.setAll(true);  
56 - continue;  
57 - }  
58 - // 情况二,DEPT_CUSTOM  
59 - if (Objects.equals(role.getDataScope(), DataScopeEnum.DEPT_CUSTOM.getScope())) {  
60 - CollUtil.addAll(result.getDeptIds(), role.getDataScopeDeptIds());  
61 - continue;  
62 - }  
63 - // 情况三,DEPT_ONLY  
64 - if (Objects.equals(role.getDataScope(), DataScopeEnum.DEPT_ONLY.getScope())) {  
65 - CollectionUtils.addIfNotNull(result.getDeptIds(), loginUser.getDeptId());  
66 - continue;  
67 - }  
68 - // 情况四,DEPT_DEPT_AND_CHILD  
69 - if (Objects.equals(role.getDataScope(), DataScopeEnum.DEPT_AND_CHILD.getScope())) {  
70 - List<SysDeptDO> depts = deptService.getDeptsByParentIdFromCache(loginUser.getDeptId(), true);  
71 - CollUtil.addAll(result.getDeptIds(), CollectionUtils.convertList(depts, SysDeptDO::getId));  
72 - continue;  
73 - }  
74 - // 情况五,SELF  
75 - if (Objects.equals(role.getDataScope(), DataScopeEnum.SELF.getScope())) {  
76 - result.setSelf(true);  
77 - continue;  
78 - }  
79 - // 未知情况,error log 即可  
80 - log.error("[getDeptDataPermission][LoginUser({}) role({}) 无法处理]", loginUser.getId(), JsonUtils.toJsonString(result));  
81 - }  
82 -  
83 - // 添加到缓存,并返回  
84 - loginUser.setContext(CONTEXT_KEY, result);  
85 - return null;  
86 - }  
87 -  
88 -}  
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserController.http
1 ### 请求 /system/user/page 接口 => 没有权限 1 ### 请求 /system/user/page 接口 => 没有权限
2 GET {{baseUrl}}/system/user/page?pageNo=1&pageSize=10 2 GET {{baseUrl}}/system/user/page?pageNo=1&pageSize=10
3 -Authorization: Bearer test104 # 使用测试账号 3 +Authorization: Bearer test1 # 使用测试账号
  4 +tenant-id: 1
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/datapermission/config/SysDataPermissionConfiguration.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.system.framework.datapermission.config;
  2 +
  3 +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO;
  4 +import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
  5 +import cn.iocoder.yudao.framework.datapermission.core.dept.rule.DeptDataPermissionRuleCustomizer;
  6 +import org.springframework.context.annotation.Bean;
  7 +import org.springframework.context.annotation.Configuration;
  8 +
  9 +/**
  10 + * system 模块的数据权限 Configuration
  11 + *
  12 + * @author 芋道源码
  13 + */
  14 +@Configuration
  15 +public class SysDataPermissionConfiguration {
  16 +
  17 + @Bean
  18 + public DeptDataPermissionRuleCustomizer sysDeptDataPermissionRuleCustomizer() {
  19 + return rule -> {
  20 + rule.addDeptColumn(SysUserDO.class);
  21 + rule.addDeptColumn(SysDeptDO.class, "id");
  22 + };
  23 + }
  24 +
  25 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/framework/datapermission/package-info.java 0 → 100644
  1 +/**
  2 + * system 模块的数据权限配置
  3 + */
  4 +package cn.iocoder.yudao.adminserver.modules.system.framework.datapermission;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/SysPermissionService.java
1 package cn.iocoder.yudao.adminserver.modules.system.service.permission; 1 package cn.iocoder.yudao.adminserver.modules.system.service.permission;
2 2
  3 +import cn.iocoder.yudao.framework.datapermission.core.dept.service.DeptDataPermissionFrameworkService;
3 import cn.iocoder.yudao.framework.security.core.service.SecurityPermissionFrameworkService; 4 import cn.iocoder.yudao.framework.security.core.service.SecurityPermissionFrameworkService;
4 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysMenuDO; 5 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysMenuDO;
5 import org.springframework.lang.Nullable; 6 import org.springframework.lang.Nullable;
@@ -15,7 +16,7 @@ import java.util.Set; @@ -15,7 +16,7 @@ import java.util.Set;
15 * 16 *
16 * @author 芋道源码 17 * @author 芋道源码
17 */ 18 */
18 -public interface SysPermissionService extends SecurityPermissionFrameworkService { 19 +public interface SysPermissionService extends SecurityPermissionFrameworkService, DeptDataPermissionFrameworkService {
19 20
20 /** 21 /**
21 * 初始化权限的本地缓存 22 * 初始化权限的本地缓存
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/permission/impl/SysPermissionServiceImpl.java
@@ -3,19 +3,25 @@ package cn.iocoder.yudao.adminserver.modules.system.service.permission.impl; @@ -3,19 +3,25 @@ package cn.iocoder.yudao.adminserver.modules.system.service.permission.impl;
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.collection.CollectionUtil; 4 import cn.hutool.core.collection.CollectionUtil;
5 import cn.hutool.core.util.ArrayUtil; 5 import cn.hutool.core.util.ArrayUtil;
6 -import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;  
7 -import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission.SysRoleMenuMapper;  
8 -import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission.SysUserRoleMapper; 6 +import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO;
9 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysMenuDO; 7 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysMenuDO;
10 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO; 8 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO;
11 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleMenuDO; 9 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleMenuDO;
12 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysUserRoleDO; 10 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysUserRoleDO;
  11 +import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission.SysRoleMenuMapper;
  12 +import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.permission.SysUserRoleMapper;
13 import cn.iocoder.yudao.adminserver.modules.system.mq.producer.permission.SysPermissionProducer; 13 import cn.iocoder.yudao.adminserver.modules.system.mq.producer.permission.SysPermissionProducer;
  14 +import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService;
14 import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysMenuService; 15 import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysMenuService;
15 import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService; 16 import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService;
16 import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysRoleService; 17 import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysRoleService;
17 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; 18 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
18 import cn.iocoder.yudao.framework.common.util.collection.MapUtils; 19 import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
  20 +import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
  21 +import cn.iocoder.yudao.framework.datapermission.core.dept.service.dto.DeptDataPermissionRespDTO;
  22 +import cn.iocoder.yudao.framework.security.core.LoginUser;
  23 +import cn.iocoder.yudao.framework.security.core.enums.DataScopeEnum;
  24 +import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
19 import com.google.common.collect.ImmutableMultimap; 25 import com.google.common.collect.ImmutableMultimap;
20 import com.google.common.collect.Multimap; 26 import com.google.common.collect.Multimap;
21 import com.google.common.collect.Sets; 27 import com.google.common.collect.Sets;
@@ -40,6 +46,11 @@ import java.util.*; @@ -40,6 +46,11 @@ import java.util.*;
40 public class SysPermissionServiceImpl implements SysPermissionService { 46 public class SysPermissionServiceImpl implements SysPermissionService {
41 47
42 /** 48 /**
  49 + * LoginUser 的 Context 缓存 Key
  50 + */
  51 + private static final String CONTEXT_KEY = SysPermissionServiceImpl.class.getSimpleName();
  52 +
  53 + /**
43 * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 54 * 定时执行 {@link #schedulePeriodicRefresh()} 的周期
44 * 因为已经通过 Redis Pub/Sub 机制,所以频率不需要高 55 * 因为已经通过 Redis Pub/Sub 机制,所以频率不需要高
45 */ 56 */
@@ -75,6 +86,8 @@ public class SysPermissionServiceImpl implements SysPermissionService { @@ -75,6 +86,8 @@ public class SysPermissionServiceImpl implements SysPermissionService {
75 private SysRoleService roleService; 86 private SysRoleService roleService;
76 @Resource 87 @Resource
77 private SysMenuService menuService; 88 private SysMenuService menuService;
  89 + @Resource
  90 + private SysDeptService deptService;
78 91
79 @Resource 92 @Resource
80 private SysPermissionProducer permissionProducer; 93 private SysPermissionProducer permissionProducer;
@@ -329,4 +342,58 @@ public class SysPermissionServiceImpl implements SysPermissionService { @@ -329,4 +342,58 @@ public class SysPermissionServiceImpl implements SysPermissionService {
329 return CollUtil.containsAny(userRoles, Sets.newHashSet(roles)); 342 return CollUtil.containsAny(userRoles, Sets.newHashSet(roles));
330 } 343 }
331 344
  345 + @Override
  346 + public DeptDataPermissionRespDTO getDeptDataPermission(LoginUser loginUser) {
  347 + // 判断是否 context 已经缓存
  348 + DeptDataPermissionRespDTO result = loginUser.getContext(CONTEXT_KEY, DeptDataPermissionRespDTO.class);
  349 + if (result != null) {
  350 + return result;
  351 + }
  352 +
  353 + // 创建 DeptDataPermissionRespDTO 对象
  354 + result = new DeptDataPermissionRespDTO();
  355 + List<SysRoleDO> roles = roleService.getRolesFromCache(loginUser.getRoleIds());
  356 + for (SysRoleDO role : roles) {
  357 + // 为空时,跳过
  358 + if (role.getDataScope() == null) {
  359 + continue;
  360 + }
  361 + // 情况一,ALL
  362 + if (Objects.equals(role.getDataScope(), DataScopeEnum.ALL.getScope())) {
  363 + result.setAll(true);
  364 + continue;
  365 + }
  366 + // 情况二,DEPT_CUSTOM
  367 + if (Objects.equals(role.getDataScope(), DataScopeEnum.DEPT_CUSTOM.getScope())) {
  368 + CollUtil.addAll(result.getDeptIds(), role.getDataScopeDeptIds());
  369 + // 自定义可见部门时,保证可以看到自己所在的部门。否则,一些场景下可能会有问题。
  370 + // 例如说,登录时,基于 t_user 的 username 查询会可能被 dept_id 过滤掉
  371 + CollUtil.addAll(result.getDeptIds(), loginUser.getDeptId());
  372 + continue;
  373 + }
  374 + // 情况三,DEPT_ONLY
  375 + if (Objects.equals(role.getDataScope(), DataScopeEnum.DEPT_ONLY.getScope())) {
  376 + CollectionUtils.addIfNotNull(result.getDeptIds(), loginUser.getDeptId());
  377 + continue;
  378 + }
  379 + // 情况四,DEPT_DEPT_AND_CHILD
  380 + if (Objects.equals(role.getDataScope(), DataScopeEnum.DEPT_AND_CHILD.getScope())) {
  381 + List<SysDeptDO> depts = deptService.getDeptsByParentIdFromCache(loginUser.getDeptId(), true);
  382 + CollUtil.addAll(result.getDeptIds(), CollectionUtils.convertList(depts, SysDeptDO::getId));
  383 + continue;
  384 + }
  385 + // 情况五,SELF
  386 + if (Objects.equals(role.getDataScope(), DataScopeEnum.SELF.getScope())) {
  387 + result.setSelf(true);
  388 + continue;
  389 + }
  390 + // 未知情况,error log 即可
  391 + log.error("[getDeptDataPermission][LoginUser({}) role({}) 无法处理]", loginUser.getId(), JsonUtils.toJsonString(result));
  392 + }
  393 +
  394 + // 添加到缓存,并返回
  395 + loginUser.setContext(CONTEXT_KEY, result);
  396 + return result;
  397 + }
  398 +
332 } 399 }
yudao-framework/yudao-spring-boot-starter-data-permission/pom.xml
@@ -21,6 +21,13 @@ @@ -21,6 +21,13 @@
21 <artifactId>yudao-common</artifactId> 21 <artifactId>yudao-common</artifactId>
22 </dependency> 22 </dependency>
23 23
  24 + <!-- Web 相关 -->
  25 + <dependency>
  26 + <groupId>cn.iocoder.boot</groupId>
  27 + <artifactId>yudao-spring-boot-starter-security</artifactId>
  28 + <optional>true</optional> <!-- 可选,如果使用 DeptDataPermissionRule 必须提供 -->
  29 + </dependency>
  30 +
24 <!-- DB 相关 --> 31 <!-- DB 相关 -->
25 <dependency> 32 <dependency>
26 <groupId>cn.iocoder.boot</groupId> 33 <groupId>cn.iocoder.boot</groupId>
yudao-framework/yudao-spring-boot-starter-data-permission/src/main/java/cn/iocoder/yudao/framework/datapermission/config/DataPermissionAutoConfiguration.java renamed to yudao-framework/yudao-spring-boot-starter-data-permission/src/main/java/cn/iocoder/yudao/framework/datapermission/config/YudaoDataPermissionAutoConfiguration.java
@@ -18,7 +18,7 @@ import java.util.List; @@ -18,7 +18,7 @@ import java.util.List;
18 * @author 芋道源码 18 * @author 芋道源码
19 */ 19 */
20 @Configuration 20 @Configuration
21 -public class DataPermissionAutoConfiguration { 21 +public class YudaoDataPermissionAutoConfiguration {
22 22
23 @Bean 23 @Bean
24 public DataPermissionRuleFactory dataPermissionRuleFactory(List<DataPermissionRule> rules) { 24 public DataPermissionRuleFactory dataPermissionRuleFactory(List<DataPermissionRule> rules) {
yudao-framework/yudao-spring-boot-starter-data-permission/src/main/java/cn/iocoder/yudao/framework/datapermission/config/YudaoDeptDataPermissionAutoConfiguration.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.datapermission.config;
  2 +
  3 +import cn.iocoder.yudao.framework.datapermission.core.dept.rule.DeptDataPermissionRule;
  4 +import cn.iocoder.yudao.framework.datapermission.core.dept.rule.DeptDataPermissionRuleCustomizer;
  5 +import cn.iocoder.yudao.framework.datapermission.core.dept.service.DeptDataPermissionFrameworkService;
  6 +import cn.iocoder.yudao.framework.security.core.LoginUser;
  7 +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
  8 +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
  9 +import org.springframework.context.annotation.Bean;
  10 +import org.springframework.context.annotation.Configuration;
  11 +
  12 +import java.util.List;
  13 +
  14 +/**
  15 + * 基于部门的数据权限 AutoConfiguration
  16 + *
  17 + * @author 芋道源码
  18 + */
  19 +@Configuration
  20 +@ConditionalOnClass(LoginUser.class)
  21 +@ConditionalOnBean(value = {DeptDataPermissionFrameworkService.class, DeptDataPermissionRuleCustomizer.class})
  22 +public class YudaoDeptDataPermissionAutoConfiguration {
  23 +
  24 + @Bean
  25 + public DeptDataPermissionRule deptDataPermissionRule(DeptDataPermissionFrameworkService service,
  26 + List<DeptDataPermissionRuleCustomizer> customizers) {
  27 + // 创建 DeptDataPermissionRule 对象
  28 + DeptDataPermissionRule rule = new DeptDataPermissionRule(service);
  29 + // 补全表配置
  30 + customizers.forEach(customizer -> customizer.customize(rule));
  31 + return rule;
  32 + }
  33 +
  34 +}
yudao-framework/yudao-spring-boot-starter-data-permission/src/main/java/cn/iocoder/yudao/framework/datapermission/core/dept/package-info.java 0 → 100644
  1 +/**
  2 + * 基于部门的数据权限规则
  3 + *
  4 + * @author 芋道源码
  5 + */
  6 +package cn.iocoder.yudao.framework.datapermission.core.dept;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/datapermission/core/rule/DeptDataPermissionRule.java renamed to yudao-framework/yudao-spring-boot-starter-data-permission/src/main/java/cn/iocoder/yudao/framework/datapermission/core/dept/rule/DeptDataPermissionRule.java
1 -package cn.iocoder.yudao.adminserver.framework.datapermission.core.rule; 1 +package cn.iocoder.yudao.framework.datapermission.core.dept.rule;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.util.StrUtil; 4 import cn.hutool.core.util.StrUtil;
5 -import cn.iocoder.yudao.adminserver.framework.datapermission.core.service.DeptDataPermissionService;  
6 -import cn.iocoder.yudao.adminserver.framework.datapermission.core.service.dto.DeptDataPermissionRespDTO; 5 +import cn.iocoder.yudao.framework.datapermission.core.dept.service.DeptDataPermissionFrameworkService;
  6 +import cn.iocoder.yudao.framework.datapermission.core.dept.service.dto.DeptDataPermissionRespDTO;
7 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; 7 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
8 import cn.iocoder.yudao.framework.common.util.json.JsonUtils; 8 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
9 import cn.iocoder.yudao.framework.datapermission.core.rule.DataPermissionRule; 9 import cn.iocoder.yudao.framework.datapermission.core.rule.DataPermissionRule;
@@ -51,7 +51,7 @@ public class DeptDataPermissionRule implements DataPermissionRule { @@ -51,7 +51,7 @@ public class DeptDataPermissionRule implements DataPermissionRule {
51 private static final String DEPT_COLUMN_NAME = "dept_id"; 51 private static final String DEPT_COLUMN_NAME = "dept_id";
52 private static final String USER_COLUMN_NAME = "user_id"; 52 private static final String USER_COLUMN_NAME = "user_id";
53 53
54 - private final DeptDataPermissionService deptDataPermissionService; 54 + private final DeptDataPermissionFrameworkService deptDataPermissionService;
55 55
56 /** 56 /**
57 * 基于部门的表字段配置 57 * 基于部门的表字段配置
@@ -60,7 +60,7 @@ public class DeptDataPermissionRule implements DataPermissionRule { @@ -60,7 +60,7 @@ public class DeptDataPermissionRule implements DataPermissionRule {
60 * key:表名 60 * key:表名
61 * value:字段名 61 * value:字段名
62 */ 62 */
63 - private final Map<String, String> DEPT_TABLE_CONFIG = new HashMap<>(); 63 + private final Map<String, String> deptColumns = new HashMap<>();
64 /** 64 /**
65 * 基于用户的表字段配置 65 * 基于用户的表字段配置
66 * 一般情况下,每个表的部门编号字段是 dept_id,通过该配置自定义。 66 * 一般情况下,每个表的部门编号字段是 dept_id,通过该配置自定义。
@@ -68,9 +68,9 @@ public class DeptDataPermissionRule implements DataPermissionRule { @@ -68,9 +68,9 @@ public class DeptDataPermissionRule implements DataPermissionRule {
68 * key:表名 68 * key:表名
69 * value:字段名 69 * value:字段名
70 */ 70 */
71 - private final Map<String, String> USER_TABLE_CONFIG = new HashMap<>(); 71 + private final Map<String, String> userColumns = new HashMap<>();
72 /** 72 /**
73 - * 所有表名,是 {@link #DEPT_TABLE_CONFIG} 和 {@link #USER_TABLE_CONFIG} 的合集 73 + * 所有表名,是 {@link #deptColumns} 和 {@link #userColumns} 的合集
74 */ 74 */
75 private final Set<String> TABLE_NAMES = new HashSet<>(); 75 private final Set<String> TABLE_NAMES = new HashSet<>();
76 76
@@ -126,7 +126,7 @@ public class DeptDataPermissionRule implements DataPermissionRule { @@ -126,7 +126,7 @@ public class DeptDataPermissionRule implements DataPermissionRule {
126 126
127 private Expression buildDeptExpression(String tableName, Alias tableAlias, Set<Long> deptIds) { 127 private Expression buildDeptExpression(String tableName, Alias tableAlias, Set<Long> deptIds) {
128 // 如果不存在配置,则无需作为条件 128 // 如果不存在配置,则无需作为条件
129 - String columnName = DEPT_TABLE_CONFIG.get(tableName); 129 + String columnName = deptColumns.get(tableName);
130 if (StrUtil.isEmpty(columnName)) { 130 if (StrUtil.isEmpty(columnName)) {
131 return null; 131 return null;
132 } 132 }
@@ -140,7 +140,7 @@ public class DeptDataPermissionRule implements DataPermissionRule { @@ -140,7 +140,7 @@ public class DeptDataPermissionRule implements DataPermissionRule {
140 if (Boolean.FALSE.equals(self)) { 140 if (Boolean.FALSE.equals(self)) {
141 return null; 141 return null;
142 } 142 }
143 - String columnName = USER_TABLE_CONFIG.get(tableName); 143 + String columnName = userColumns.get(tableName);
144 if (StrUtil.isEmpty(columnName)) { 144 if (StrUtil.isEmpty(columnName)) {
145 return null; 145 return null;
146 } 146 }
@@ -150,23 +150,23 @@ public class DeptDataPermissionRule implements DataPermissionRule { @@ -150,23 +150,23 @@ public class DeptDataPermissionRule implements DataPermissionRule {
150 150
151 // ==================== 添加配置 ==================== 151 // ==================== 添加配置 ====================
152 152
153 - public void addDeptTableConfig(Class<? extends BaseDO> entityClass) {  
154 - addDeptTableConfig(entityClass, DEPT_COLUMN_NAME); 153 + public void addDeptColumn(Class<? extends BaseDO> entityClass) {
  154 + addDeptColumn(entityClass, DEPT_COLUMN_NAME);
155 } 155 }
156 156
157 - public void addDeptTableConfig(Class<? extends BaseDO> entityClass, String columnName) { 157 + public void addDeptColumn(Class<? extends BaseDO> entityClass, String columnName) {
158 String tableName = TableInfoHelper.getTableInfo(entityClass).getTableName(); 158 String tableName = TableInfoHelper.getTableInfo(entityClass).getTableName();
159 - DEPT_TABLE_CONFIG.put(tableName, columnName); 159 + deptColumns.put(tableName, columnName);
160 TABLE_NAMES.add(tableName); 160 TABLE_NAMES.add(tableName);
161 } 161 }
162 162
163 - public void addUserTableConfig(Class<? extends BaseDO> entityClass) {  
164 - addUserTableConfig(entityClass, DEPT_COLUMN_NAME); 163 + public void addUserColumn(Class<? extends BaseDO> entityClass) {
  164 + addUserColumn(entityClass, USER_COLUMN_NAME);
165 } 165 }
166 166
167 - public void addUserTableConfig(Class<? extends BaseDO> entityClass, String columnName) { 167 + public void addUserColumn(Class<? extends BaseDO> entityClass, String columnName) {
168 String tableName = TableInfoHelper.getTableInfo(entityClass).getTableName(); 168 String tableName = TableInfoHelper.getTableInfo(entityClass).getTableName();
169 - USER_TABLE_CONFIG.put(tableName, columnName); 169 + userColumns.put(tableName, columnName);
170 TABLE_NAMES.add(tableName); 170 TABLE_NAMES.add(tableName);
171 } 171 }
172 172
yudao-framework/yudao-spring-boot-starter-data-permission/src/main/java/cn/iocoder/yudao/framework/datapermission/core/dept/rule/DeptDataPermissionRuleCustomizer.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.datapermission.core.dept.rule;
  2 +
  3 +/**
  4 + * {@link DeptDataPermissionRule} 的自定义配置接口
  5 + *
  6 + * @author 芋道源码
  7 + */
  8 +@FunctionalInterface
  9 +public interface DeptDataPermissionRuleCustomizer {
  10 +
  11 + /**
  12 + * 自定义该权限规则
  13 + * 1. 调用 {@link DeptDataPermissionRule#addDeptColumn(Class, String)} 方法,配置基于 dept_id 的过滤规则
  14 + * 2. 调用 {@link DeptDataPermissionRule#addUserColumn(Class, String)} 方法,配置基于 user_id 的过滤规则
  15 + *
  16 + * @param rule 权限规则
  17 + */
  18 + void customize(DeptDataPermissionRule rule);
  19 +
  20 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/datapermission/core/service/DeptDataPermissionService.java renamed to yudao-framework/yudao-spring-boot-starter-data-permission/src/main/java/cn/iocoder/yudao/framework/datapermission/core/dept/service/DeptDataPermissionFrameworkService.java
1 -package cn.iocoder.yudao.adminserver.framework.datapermission.core.service; 1 +package cn.iocoder.yudao.framework.datapermission.core.dept.service;
2 2
3 -import cn.iocoder.yudao.adminserver.framework.datapermission.core.service.dto.DeptDataPermissionRespDTO; 3 +import cn.iocoder.yudao.framework.datapermission.core.dept.service.dto.DeptDataPermissionRespDTO;
4 import cn.iocoder.yudao.framework.security.core.LoginUser; 4 import cn.iocoder.yudao.framework.security.core.LoginUser;
5 5
6 /** 6 /**
7 - * 基于部门的数据权限 Service 接口 7 + * 基于部门的数据权限 Framework Service 接口
  8 + * 目前的实现类是 SysPermissionServiceImpl 类
8 * 9 *
9 * @author 芋道源码 10 * @author 芋道源码
10 */ 11 */
11 -public interface DeptDataPermissionService { 12 +public interface DeptDataPermissionFrameworkService {
12 13
13 /** 14 /**
14 * 获得登陆用户的部门数据权限 15 * 获得登陆用户的部门数据权限
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/framework/datapermission/core/service/dto/DeptDataPermissionRespDTO.java renamed to yudao-framework/yudao-spring-boot-starter-data-permission/src/main/java/cn/iocoder/yudao/framework/datapermission/core/dept/service/dto/DeptDataPermissionRespDTO.java
1 -package cn.iocoder.yudao.adminserver.framework.datapermission.core.service.dto; 1 +package cn.iocoder.yudao.framework.datapermission.core.dept.service.dto;
2 2
3 import lombok.Data; 3 import lombok.Data;
4 4
5 -import java.util.ArrayList;  
6 import java.util.HashSet; 5 import java.util.HashSet;
7 -import java.util.List;  
8 import java.util.Set; 6 import java.util.Set;
9 7
10 /** 8 /**
yudao-framework/yudao-spring-boot-starter-data-permission/src/main/resources/META-INF/spring.factories
1 org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ 1 org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
2 - cn.iocoder.yudao.framework.datapermission.config.DataPermissionAutoConfiguration 2 + cn.iocoder.yudao.framework.datapermission.config.YudaoDataPermissionAutoConfiguration,\
  3 + cn.iocoder.yudao.framework.datapermission.config.YudaoDeptDataPermissionAutoConfiguration
yudao-framework/yudao-spring-boot-starter-tenant/pom.xml
@@ -23,11 +23,6 @@ @@ -23,11 +23,6 @@
23 23
24 <!-- Web 相关 --> 24 <!-- Web 相关 -->
25 <dependency> 25 <dependency>
26 - <groupId>org.springframework.boot</groupId>  
27 - <artifactId>spring-boot-starter-web</artifactId>  
28 - </dependency>  
29 -  
30 - <dependency>  
31 <groupId>cn.iocoder.boot</groupId> 26 <groupId>cn.iocoder.boot</groupId>
32 <artifactId>yudao-spring-boot-starter-security</artifactId> 27 <artifactId>yudao-spring-boot-starter-security</artifactId>
33 </dependency> 28 </dependency>