diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/aspect/DataPermissionAdvice.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/aspect/DataPermissionAdvice.java index e0bacc4b1..81e5b6707 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/aspect/DataPermissionAdvice.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/aspect/DataPermissionAdvice.java @@ -26,14 +26,19 @@ public class DataPermissionAdvice implements MethodInterceptor { public Object invoke(MethodInvocation invocation) throws Throwable { Object target = invocation.getThis(); Method method = invocation.getMethod(); + DataPermission previousPermission = DataPermissionHelper.getPermission(); // 设置权限注解 DataPermissionHelper.setPermission(getDataPermissionAnnotation(target, method)); try { // 执行代理方法 return invocation.proceed(); } finally { - // 清除权限注解 - DataPermissionHelper.removePermission(); + // 恢复上一层权限上下文,兼容嵌套 Mapper 调用 + if (previousPermission == null) { + DataPermissionHelper.removePermission(); + } else { + DataPermissionHelper.setPermission(previousPermission); + } } } diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java index dc714e4ce..8e19c7237 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java @@ -71,13 +71,17 @@ public class PlusDataPermissionHandler { */ public Expression getSqlSegment(Expression where, boolean isSelect) { try { + DataPermission dataPermission = getDataPermission(); + if (dataPermission == null) { + throw new ServiceException("数据权限上下文缺失,请检查 @DataPermission 注解处理生命周期"); + } LoginUser currentUser = currentUser(); // 如果是超级管理员或租户管理员,则不过滤数据 if (LoginHelper.isSuperAdmin()) { return where; } // 构造数据过滤条件的 SQL 片段 - String dataFilterSql = buildDataFilter(getDataPermission(), currentUser, isSelect); + String dataFilterSql = buildDataFilter(dataPermission, currentUser, isSelect); if (StringUtils.isBlank(dataFilterSql)) { return where; } @@ -91,8 +95,6 @@ public class PlusDataPermissionHandler { } } catch (JSQLParserException e) { throw new ServiceException("数据权限解析异常 => " + e.getMessage()); - } finally { - DataPermissionHelper.removePermission(); } }