package com.iailab.framework.datapermission.core.rule; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ArrayUtil; import com.iailab.framework.datapermission.core.annotation.DataPermission; import com.iailab.framework.datapermission.core.aop.DataPermissionContextHolder; import lombok.RequiredArgsConstructor; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; /** * 默认的 DataPermissionRuleFactoryImpl 实现类 * 支持通过 {@link DataPermissionContextHolder} 过滤数据权限 * * @author iailab */ @RequiredArgsConstructor public class DataPermissionRuleFactoryImpl implements DataPermissionRuleFactory { /** * 数据权限规则数组 */ private final List rules; @Override public List getDataPermissionRules() { return rules; } @Override // mappedStatementId 参数,暂时没有用。以后,可以基于 mappedStatementId + DataPermission 进行缓存 public List getDataPermissionRule(String mappedStatementId) { // 1. 无数据权限 if (CollUtil.isEmpty(rules)) { return Collections.emptyList(); } // 2. 未配置,则默认开启 DataPermission dataPermission = DataPermissionContextHolder.get(); if (dataPermission == null) { return rules; } // 3. 已配置,但禁用 if (!dataPermission.enable()) { return Collections.emptyList(); } // 4. 已配置,只选择部分规则 if (ArrayUtil.isNotEmpty(dataPermission.includeRules())) { return rules.stream().filter(rule -> ArrayUtil.contains(dataPermission.includeRules(), rule.getClass())) .collect(Collectors.toList()); // 一般规则不会太多,所以不采用 HashSet 查询 } // 5. 已配置,只排除部分规则 if (ArrayUtil.isNotEmpty(dataPermission.excludeRules())) { return rules.stream().filter(rule -> !ArrayUtil.contains(dataPermission.excludeRules(), rule.getClass())) .collect(Collectors.toList()); // 一般规则不会太多,所以不采用 HashSet 查询 } // 6. 已配置,全部规则 return rules; } }