数据权限 (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
接口,并实现 isFilter
和 getUserData()
方法。
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 方法?
因为 selectOne
,selectPage
都是依赖 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-extension | MyBatis Plus jsqlparser 适配(包含原扩展模块内容) |
参考资料
- 数据权限插件 | MyBatis-Plus:https://baomidou.com/plugins/data-permission/