diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java index 2fa57f5ca..dd23d3e54 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java @@ -162,7 +162,7 @@ public class SysUser extends BaseEntity { private Long[] postIds; /** - * 角色ID + * 数据权限 当前角色ID */ @ApiModelProperty(value = "角色ID") @TableField(exist = false) diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataScopeType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataScopeType.java index 8e3fd5a16..f99413bad 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataScopeType.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataScopeType.java @@ -9,7 +9,10 @@ import lombok.Getter; * * 语法支持 spel 模板表达式 * - * 内置数据 当前用户的 deptId 部门id roleId 角色id userId 用户id + * 内置数据 user 当前用户 内容参考 SysUser + * 如需扩展数据 需往 SysUser 内注入 + * 内置服务 sdss 系统数据权限服务 内容参考 SysDataScopeService + * 如需扩展更多自定义服务 可以参考 sdss 自行编写 * * @author Lion Li */ @@ -25,22 +28,22 @@ public enum DataScopeType { /** * 自定数据权限 */ - CUSTOM("2", " #{#deptName} IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = #{#roleId} ) "), + CUSTOM("2", " #{#deptName} IN ( #{@sdss.getRoleCustom( #user.roleId )} ) "), /** * 部门数据权限 */ - DEPT("3", " #{#deptName} = #{#deptId} "), + DEPT("3", " #{#deptName} = #{#user.deptId} "), /** * 部门及以下数据权限 */ - DEPT_AND_CHILD("4", " #{#deptName} IN ( SELECT dept_id FROM sys_dept WHERE dept_id = #{#deptId} OR find_in_set( #{#deptId} , ancestors ) )"), + DEPT_AND_CHILD("4", " #{#deptName} IN ( #{@sdss.getDeptAndChild( #user.deptId )} )"), /** * 仅本人数据权限 */ - SELF("5", " #{#userName?:1} = #{#userId} "); + SELF("5", " #{#userName?:1} = #{#user.userId} "); private final String code; diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/PlusDataPermissionHandler.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/PlusDataPermissionHandler.java index a7c7fded6..89897c31d 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/PlusDataPermissionHandler.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/PlusDataPermissionHandler.java @@ -19,7 +19,8 @@ import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.operators.conditional.AndExpression; import net.sf.jsqlparser.parser.CCJSqlParserUtil; -import org.springframework.expression.EvaluationContext; +import org.springframework.context.expression.BeanFactoryResolver; +import org.springframework.expression.BeanResolver; import org.springframework.expression.ExpressionParser; import org.springframework.expression.ParserContext; import org.springframework.expression.common.TemplateParserContext; @@ -41,6 +42,7 @@ public class PlusDataPermissionHandler { private final ExpressionParser parser = new SpelExpressionParser(); private final ParserContext parserContext = new TemplateParserContext(); + private final BeanResolver beanResolver = new BeanFactoryResolver(SpringUtils.getBeanFactory()); public Expression getSqlSegment(Expression where, String mappedStatementId, boolean isSelect) { DataColumn[] dataColumns = findAnnotation(mappedStatementId); @@ -74,15 +76,16 @@ public class PlusDataPermissionHandler { private String buildDataFilter(SysUser user, DataColumn[] dataColumns, boolean isSelect) { StringBuilder sqlString = new StringBuilder(); - EvaluationContext context = new StandardEvaluationContext(); - context.setVariable("userId", user.getUserId()); - context.setVariable("deptId", user.getDeptId()); + StandardEvaluationContext context = new StandardEvaluationContext(); + context.setBeanResolver(beanResolver); + context.setVariable("user", user); for (DataColumn dataColumn : dataColumns) { // 设置注解变量 key 为表达式变量 value 为变量值 context.setVariable(dataColumn.key(), dataColumn.value()); for (SysRole role : user.getRoles()) { - context.setVariable("roleId", role.getRoleId()); + user.setRoleId(role.getRoleId()); + // 获取角色权限泛型 DataScopeType type = DataScopeType.findCode(role.getDataScope()); if (ObjectUtil.isNull(type)) { diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java index 08c88caba..317be7e3c 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java @@ -1,7 +1,5 @@ package com.ruoyi.system.mapper; -import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.toolkit.Constants; import com.ruoyi.common.annotation.DataColumn; import com.ruoyi.common.annotation.DataPermission; import com.ruoyi.common.core.domain.entity.SysDept; @@ -28,12 +26,6 @@ public interface SysDeptMapper extends BaseMapperPlus { }) List selectDeptList(SysDept dept); - @Override - @DataPermission({ - @DataColumn(key = "deptName", value = "dept_id") - }) - List selectList(@Param(Constants.WRAPPER) Wrapper queryWrapper); - /** * 根据角色ID查询部门树信息 * diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/SysDataScopeService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/SysDataScopeService.java new file mode 100644 index 000000000..34e2ea33c --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/SysDataScopeService.java @@ -0,0 +1,24 @@ +package com.ruoyi.system.service; + +/** + * 通用 数据权限 服务 + * + * @author Lion Li + */ +public interface SysDataScopeService { + + /** + * 获取角色自定义权限 + * @param roleId 角色id + * @return 部门id组 + */ + String getRoleCustom(Long roleId); + + /** + * 获取部门及以下权限 + * @param deptId 部门id + * @return 部门id组 + */ + String getDeptAndChild(Long deptId); + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDataScopeServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDataScopeServiceImpl.java new file mode 100644 index 000000000..87ce49ff5 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDataScopeServiceImpl.java @@ -0,0 +1,49 @@ +package com.ruoyi.system.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.common.core.domain.entity.SysDept; +import com.ruoyi.system.domain.SysRoleDept; +import com.ruoyi.system.mapper.SysDeptMapper; +import com.ruoyi.system.mapper.SysRoleDeptMapper; +import com.ruoyi.system.service.SysDataScopeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service("sdss") +public class SysDataScopeServiceImpl implements SysDataScopeService { + + @Autowired + private SysRoleDeptMapper roleDeptMapper; + @Autowired + private SysDeptMapper deptMapper; + + @Override + public String getRoleCustom(Long roleId) { + List list = roleDeptMapper.selectList( + new LambdaQueryWrapper() + .select(SysRoleDept::getDeptId) + .eq(SysRoleDept::getRoleId, roleId)); + if (CollUtil.isNotEmpty(list)) { + return StrUtil.join(",", list); + } + return null; + } + + @Override + public String getDeptAndChild(Long deptId) { + List list = deptMapper.selectList(new LambdaQueryWrapper() + .select(SysDept::getDeptId) + .eq(SysDept::getDeptId, deptId) + .or() + .apply("find_in_set({0},ancestors)", deptId)); + if (CollUtil.isNotEmpty(list)) { + return StrUtil.join(",", list); + } + return null; + } + +}