通用数据权限过滤工具

1. 通用数据权限实体类

配合IPermissionCommonService通用权限接口进行使用,目的是获取传入用户数据权限进行过滤数据

public class PermissionVO implements Serializable {

  @ApiModelProperty("园区权限")
  private Set<String> parks;

  @ApiModelProperty("部门权限")
  private Set<String> departments;

  @ApiModelProperty("用户权限")
  private Set<String> users;
}

2. 通用数据权限接口类

@Api("通用权限接口")
public interface IPermissionCommonService {

  /**
   * 获取指定用户所具备的数据权限集合
   *
   * @param user      进行权限过滤的用户
   * @param suiteCode 套件标识
   * @return 数据权限集合
   */
  @ApiModelProperty("获取指定用户所具备的数据权限集合")
  Map<String, Set<String>> getPermissions(User user, String suiteCode);

  /**
   * 获取指定用户所具备的数据权限集合
   *
   * @param user      进行权限过滤的用户
   * @param suiteCode 套件标识
   * @return 数据权限集合
   */
  @ApiModelProperty("获取指定用户所具备的数据权限集合")
  PermissionVO getPermission(User user, String suiteCode);
}

3. 通用数据权限组合工具类

public class QueryUtil {
  /**
   * 通用权限查询对象获取,根据权限集合设置数据查询权限,部门 or 园区 or  个人
   *
   * @param permissions 权限集合
   * @param wrapper     wrapper
   */
  public static <T> void setPermission(Map<String, Set<String>> permissions,
      QueryWrapper<T> wrapper) {
    setPermission(permissions, wrapper, PARK_ID, DEPT_ID, CREATE_BY);
  }

  /**
   * 通用权限查询对象获取,根据权限集合设置数据查询权限,部门 or 园区 or  个人
   *
   * @param permissions 权限集合
   * @param wrapper     查询wrapper
   * @param parkField   园区字段
   * @param deptField   部门字段
   * @param userField   用户字段
   */
  public static <T> void setPermission(Map<String, Set<String>> permissions,
      QueryWrapper<T> wrapper, String parkField, String deptField, String userField) {
    wrapper.and(w -> {
      if (permissions.containsKey(PARK)) {
        w.or().in(parkField, permissions.get(PARK));
      }
      if (permissions.containsKey(DEPARTMENT)) {
        w.or().in(deptField, permissions.get(DEPARTMENT));
      }
      if (permissions.containsKey(USER)) {
        w.or().in(userField, permissions.get(USER));
      }
    });
    return wrapper;
  }

使用示例

  1. 开发者-指定套件-权限管理-配置数据权限

    招商业务使用招商基础设置(cn.flyrise.business.base)套件中的配置,业务可自行决定是否遵从

  1. 开发沙箱配置相应人员、角色

  1. 代码示例

    业务类使用

    以传入user为例:

    1. 当user存在园区数据权限时,将获取园区所有数据:park_id in (?,?)
    2. 当user存在部门数据权限时,将获取部门所有数据:dept_id in (?,?)
    3. 以及获取个人添加数据:create_by in (?,?)
    @Resource
    private IPermissionCommonService permissionCommonService;
    
    public Page<LeaseIntentionVO> page(User user, QueryVO vo) {
      QueryWrapper<LeaseIntentionPO> wrapper = getWrapper(vo);
      Map<String, Set<String>> permissions = permissionCommonService.getPermissions(user, BUSINESS_BASE);
      QueryUtil.setPermission(permissions, wrapper);
      wrapper.orderByDesc(ID);
      Page<LeaseIntentionPO> page = baseMapper
        .selectPage(new Page<>(vo.getPage(), vo.getSize()), wrapper);
      Page<LeaseIntentionVO> result = CastUtils.cast(page);
      result.setRecords(convertRecords(user, page.getRecords()));
      return result;
    }
文档更新时间: 2022-04-02 17:40   作者:陆鸿睿