diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/PigxDefaultDataScopeHandle.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/PigxDefaultDataScopeHandle.java new file mode 100644 index 000000000..29a6cbac0 --- /dev/null +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/PigxDefaultDataScopeHandle.java @@ -0,0 +1,163 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.data.datascope; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pigx.admin.api.entity.SysDept; +import com.pig4cloud.pigx.admin.api.entity.SysRole; +import com.pig4cloud.pigx.admin.api.feign.RemoteDataScopeService; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.constant.enums.UserTypeEnum; +import com.pig4cloud.pigx.common.core.util.RetOps; +import com.pig4cloud.pigx.common.security.service.PigxUser; +import com.pig4cloud.pigx.common.security.util.SecurityUtils; +import lombok.RequiredArgsConstructor; +import org.springframework.security.core.GrantedAuthority; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @author lengleng + * @date 2019-09-07 + *

+ * 默认data scope 判断处理器 + */ + +/** + * @author lengleng + * @date 2019-09-07 + *

+ * 默认data scope 判断处理器 + */ +@RequiredArgsConstructor +public class PigxDefaultDataScopeHandle implements DataScopeHandle { + + private final RemoteDataScopeService dataScopeService; + + @Override + public Boolean calcScope(DataScope dataScope) { + // 对于TOC客户端,不进行数据权限校验 + PigxUser user = SecurityUtils.getUser(); + if (UserTypeEnum.TOC.getStatus().equals(user.getUserType())) { + return true; + } + + // 业务代码里的规则,覆盖计算规则 + if (StrUtil.isNotBlank(dataScope.getUsername()) || CollUtil.isNotEmpty(dataScope.getDeptList())) { + return false; + } + + // 获取用户角色ID列表 + List roleIdList = user.getAuthorities().stream() + .map(GrantedAuthority::getAuthority) + .filter(authority -> authority.startsWith(SecurityConstants.ROLE)) + .map(authority -> authority.split(StrUtil.UNDERLINE)[1]) + .collect(Collectors.toList()); + if (CollUtil.isEmpty(roleIdList)) { + return false; + } + + // 获取角色列表 + List roleList = RetOps.of(dataScopeService.getRoleList(roleIdList)) + .getData() + .orElseGet(Collections::emptyList); + if (CollUtil.isEmpty(roleList)) { + return false; + } + + // 处理数据权限 + return processDataScope(user, dataScope, roleList); + } + + + /** + * 处理数据权限 + */ + private boolean processDataScope(PigxUser user, DataScope dataScope, List roleList) { + List deptList = dataScope.getDeptList(); + + for (SysRole role : roleList) { + Integer dsType = role.getDsType(); + + // 处理不同数据权限类型 + switch (Objects.requireNonNull(DataScopeTypeEnum.getByType(dsType))) { + case ALL: + return true; + case CUSTOM: + handleCustomScope(role, deptList); + break; + case OWN_CHILD_LEVEL: + handleOwnChildLevelScope(user, deptList); + break; + case OWN_LEVEL: + handleOwnLevelScope(user, deptList); + break; + case SELF_LEVEL: + handleSelfLevelScope(user, dataScope); + break; + default: + break; + } + } + + return false; + } + + /** + * 处理自定义数据权限 + */ + private void handleCustomScope(SysRole role, List deptList) { + if (StrUtil.isNotBlank(role.getDsScope())) { + deptList.addAll(Arrays.stream(role.getDsScope().split(StrUtil.COMMA)) + .map(Long::parseLong) + .collect(Collectors.toList())); + } + } + + /** + * 处理本级及下级数据权限 + */ + private void handleOwnChildLevelScope(PigxUser user, List deptList) { + List descendantDeptIds = RetOps.of(dataScopeService.getDescendantList(user.getDeptId())) + .getData() + .orElseGet(Collections::emptyList) + .stream() + .map(SysDept::getDeptId) + .collect(Collectors.toList()); + deptList.addAll(descendantDeptIds); + } + + /** + * 处理本级数据权限 + */ + private void handleOwnLevelScope(PigxUser user, List deptList) { + deptList.add(user.getDeptId()); + } + + /** + * 处理个人数据权限 + */ + private void handleSelfLevelScope(PigxUser user, DataScope dataScope) { + dataScope.setUsername(user.getUsername()); + } +} diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/PigxDefaultDatascopeHandle.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/PigxDefaultDatascopeHandle.java deleted file mode 100644 index 547c0f439..000000000 --- a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/datascope/PigxDefaultDatascopeHandle.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright (c) 2018-2025, lengleng All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the pig4cloud.com developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: lengleng (wangiegie@gmail.com) - */ - -package com.pig4cloud.pigx.common.data.datascope; - -import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.util.StrUtil; -import com.pig4cloud.pigx.admin.api.entity.SysDept; -import com.pig4cloud.pigx.admin.api.entity.SysRole; -import com.pig4cloud.pigx.admin.api.feign.RemoteDataScopeService; -import com.pig4cloud.pigx.common.core.constant.SecurityConstants; -import com.pig4cloud.pigx.common.core.constant.enums.UserTypeEnum; -import com.pig4cloud.pigx.common.core.util.RetOps; -import com.pig4cloud.pigx.common.security.service.PigxUser; -import com.pig4cloud.pigx.common.security.util.SecurityUtils; -import lombok.RequiredArgsConstructor; -import org.springframework.security.core.GrantedAuthority; - -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import java.util.stream.Collectors; - -/** - * @author lengleng - * @date 2019-09-07 - *

- * 默认data scope 判断处理器 - */ -@RequiredArgsConstructor -public class PigxDefaultDatascopeHandle implements DataScopeHandle { - - private final RemoteDataScopeService dataScopeService; - - /** - * 计算用户数据权限 - * @param dataScope 数据权限范围 - * @return - */ - @Override - public Boolean calcScope(DataScope dataScope) { - PigxUser user = SecurityUtils.getUser(); - // toc 客户端不进行数据权限 - if (UserTypeEnum.TOC.getStatus().equals(user.getUserType())) { - return true; - } - - List roleIdList = user.getAuthorities().stream().map(GrantedAuthority::getAuthority) - .filter(authority -> authority.startsWith(SecurityConstants.ROLE)) - .map(authority -> authority.split(StrUtil.UNDERLINE)[1]).collect(Collectors.toList()); - - List deptList = dataScope.getDeptList(); - - // 当前用户的角色为空 , 返回false - if (CollectionUtil.isEmpty(roleIdList)) { - return false; - } - // @formatter:off - SysRole role = RetOps.of(dataScopeService.getRoleList(roleIdList)) - .getData() - .orElseGet(Collections::emptyList) - .stream() - .min(Comparator.comparingInt(SysRole::getDsType)).orElse(null); - // @formatter:on - // 角色有可能已经删除了 - if (role == null) { - return false; - } - Integer dsType = role.getDsType(); - // 查询全部 - if (DataScopeTypeEnum.ALL.getType() == dsType) { - return true; - } - // 自定义 - if (DataScopeTypeEnum.CUSTOM.getType() == dsType && StrUtil.isNotBlank(role.getDsScope())) { - String dsScope = role.getDsScope(); - deptList.addAll( - Arrays.stream(dsScope.split(StrUtil.COMMA)).map(Long::parseLong).collect(Collectors.toList())); - } - // 查询本级及其下级 - if (DataScopeTypeEnum.OWN_CHILD_LEVEL.getType() == dsType) { - // @formatter:off - List deptIdList = RetOps.of(dataScopeService.getDescendantList(user.getDeptId())) - .getData() - .orElseGet(Collections::emptyList) - .stream() - .map(SysDept::getDeptId).collect(Collectors.toList()); - // @formatter:on - deptList.addAll(deptIdList); - } - // 只查询本级 - if (DataScopeTypeEnum.OWN_LEVEL.getType() == dsType) { - deptList.add(user.getDeptId()); - } - - // 只查询本人 - if (DataScopeTypeEnum.SELF_LEVEL.getType() == dsType) { - dataScope.setUsername(user.getUsername()); - } - return false; - } - -} diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/mybatis/MybatisPlusConfiguration.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/mybatis/MybatisPlusConfiguration.java index a43b84955..92f31e9fa 100644 --- a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/mybatis/MybatisPlusConfiguration.java +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/mybatis/MybatisPlusConfiguration.java @@ -25,7 +25,7 @@ import com.pig4cloud.pigx.admin.api.feign.RemoteDataScopeService; import com.pig4cloud.pigx.common.data.datascope.DataScopeInnerInterceptor; import com.pig4cloud.pigx.common.data.datascope.DataScopeInterceptor; import com.pig4cloud.pigx.common.data.datascope.DataScopeSqlInjector; -import com.pig4cloud.pigx.common.data.datascope.PigxDefaultDatascopeHandle; +import com.pig4cloud.pigx.common.data.datascope.PigxDefaultDataScopeHandle; import com.pig4cloud.pigx.common.data.resolver.SqlFilterArgumentResolver; import com.pig4cloud.pigx.common.data.tenant.PigxTenantConfigProperties; import com.pig4cloud.pigx.common.data.tenant.PigxTenantHandler; @@ -107,7 +107,7 @@ public class MybatisPlusConfiguration implements WebMvcConfigurer { @ConditionalOnClass(PigxUser.class) public DataScopeInterceptor dataScopeInterceptor(RemoteDataScopeService dataScopeService) { DataScopeInnerInterceptor dataScopeInnerInterceptor = new DataScopeInnerInterceptor(); - dataScopeInnerInterceptor.setDataScopeHandle(new PigxDefaultDatascopeHandle(dataScopeService)); + dataScopeInnerInterceptor.setDataScopeHandle(new PigxDefaultDataScopeHandle(dataScopeService)); return dataScopeInnerInterceptor; }