Skip to content

数据权限 (data-permission)

最后更新: 2 天前
实践版本: v2.13.4

简介

continew-starter-extension-datapermission-mp 是 ContiNew Starter 基于 MyBatis Plus 封装的通用数据权限处理扩展模块。

主要特性

  • 已提供默认数据权限处理,支持五种数据范围:全部数据权限、本部门及以下数据权限、本部门数据权限、仅本人数据权限、自定义数据权限

快速开始

引入依赖

pom.xml
xml
<dependency>
    <groupId>top.continew.starter</groupId>
    <artifactId>continew-starter-extension-datapermission-mp</artifactId>
</dependency>

添加配置

配置详情请参考类 top.continew.starter.extension.datapermission.autoconfigure.DataPermissionProperties

application.yml
yaml
--- ### 数据权限配置
continew-starter.data-permission:
  # 是否启用(默认:已启用)
  enabled: true

实现 DataPermissionUserDataProvider 接口

编写一个实现类,实现 DataPermissionUserDataProvider 接口,并实现 isFiltergetUserData() 方法。

DefaultDataPermissionUserDataProvider.java
java
import top.continew.starter.core.util.CollUtils;
import top.continew.starter.extension.datapermission.enums.DataScope;
import top.continew.starter.extension.datapermission.model.RoleData;
import top.continew.starter.extension.datapermission.model.UserData;
import top.continew.starter.extension.datapermission.provider.DataPermissionUserDataProvider;

/**
 * 数据权限用户数据提供者
 *
 * @author Charles7c
 */
@Component
public class DefaultDataPermissionUserDataProvider implements DataPermissionUserDataProvider {

    @Override
    public boolean isFilter() {
        return !UserContextHolder.isSuperAdminUser() && !UserContextHolder.isTenantAdminUser();
    }

    @Override
    public UserData getUserData() {
        UserContext userContext = UserContextHolder.getContext();
        UserData userData = new UserData();
        userData.setUserId(userContext.getId());
        userData.setDeptId(userContext.getDeptId());
        userData.setRoles(CollUtils.mapToSet(userContext.getRoles(), r -> new RoleData(r.getId(), DataScope.valueOf(r
            .getDataScope()
            .name()))));
        return userData;
    }
}

使用注解

配置好数据权限后,可以通过注解 @DataPermission 来灵活的为指定 Mapper 接口方法添加数据权限处理。为了方便使用,建议继承 BaseMapper 并使用 @DataPermission 注解重写默认方法。

为什么没有重写 selectOne、selectPage 方法?

因为 selectOneselectPage 都是依赖 selectList 实现的,所以只需要重写了 selectList 即可。

DataPermissionMapper.java
java
import top.continew.starter.data.mapper.BaseMapper;
import top.continew.starter.extension.datapermission.annotation.DataPermission;

/**
 * 数据权限 Mapper 基类
 *
 * @param <T> 实体类
 * @author Charles7c
 */
public interface DataPermissionMapper<T> extends BaseMapper<T> {

    /**
     * 根据 entity 条件,查询全部记录
     *
     * @param queryWrapper 实体对象封装操作类(可以为 null)
     * @return 全部记录
     */
    @DataPermission
    @Override
    List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * 根据 entity 条件,查询全部记录(并翻页)
     *
     * @param page         分页查询条件
     * @param queryWrapper 实体对象封装操作类(可以为 null)
     * @return 全部记录(并翻页)
     */
    @DataPermission
    @Override
    List<T> selectList(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * 根据 ID 删除
     *
     * @param id id
     * @return 删除个数
     */
    @DataPermission
    @Override
    int deleteById(@Param("id") Serializable id);
}

自定义权限处理器

如果你不想使用 ContiNew Starter 提供的默认数据权限处理器实现,但仍想基于 MyBatis Plus 提供的数据权限插件来实现数据权限处理,可自行重写 com.baomidou.mybatisplus.extension.plugins.handler.DataPermissionHandler,并将 Bean 注入到 Spring 容器即可,ContiNew Starter 组件会自动识别加载数据权限插件。

DefaultDataPermissionHandler.java
java
import com.baomidou.mybatisplus.extension.plugins.handler.DataPermissionHandler;
import top.continew.starter.extension.datapermission.provider.DataPermissionUserDataProvider;

/**
 * 默认数据权限处理器
 *
 * @author Charles7c
 */
@Component
public class DefaultDataPermissionHandler implements DataPermissionHandler {
    
    private final DataPermissionUserDataProvider dataPermissionUserDataProvider;
    
    public DefaultDataPermissionHandler(DataPermissionUserDataProvider dataPermissionUserDataProvider) {
        this.dataPermissionUserDataProvider = dataPermissionUserDataProvider;
    }
    
    @Override
    public Expression getSqlSegment(Expression where, String mappedStatementId) {
        // 自定义处理...
    }
}

核心依赖

依赖描述
top.continew.starter:continew-starter-extension-datapermission-core数据权限 - 核心模块
top.continew.starter:continew-starter-data-core数据访问模块 - 核心模块
com.baomidou:mybatis-plus-extensionMyBatis Plus jsqlparser 适配(包含原扩展模块内容)

参考资料

  1. 数据权限插件 | MyBatis-Plus:https://baomidou.com/plugins/data-permission/