Skip to content

数据权限

在现代企业应用系统中,数据权限管理是确保数据安全与合规访问的核心功能之一。它允许系统管理员根据用户的角色、部门、职位等因素灵活配置数据访问权限,从而实现对敏感信息的有效保护和精细化管理。

场景:销售经理仅能查看和编辑自己及其下属团队的销售记录。
实现:为“销售经理”角色配置“查看/编辑”权限,并设定数据范围为“本部门及以下数据权限”。当销售经理登录系统查询销售数据时,系统自动过滤,只展示符合权限的数据。

数据权限,简而言之,就是限制用户能够查看或操作的数据范围。这包括但不限于查看特定记录、编辑某些字段或执行特定操作的能力。在本项目中,目前已实现了行级数据权限,通过为每个角色选择数据权限范围,实现细粒度的数据权限控制。

角色与权限分配

管理员登录系统后,导航至“系统管理”->“角色管理”,点击“新增角色”,输入角色名称(如“销售经理”)及描述,选择好数据权限范围(如“本部门及以下数据权限”),保存即可创建新角色。

创建好角色之后,可以通过用户管理将角色分配给用户,如果开放了注册功能,也可以将指定角色设为新用户默认值。

数据权限控制

数据权限控制通过拦截 SQL 语句实现,在查询数据时,系统会自动根据当前登录用户的数据权限过滤结果集,确保用户只能看到其有权访问的信息。

配置数据权限插件

实现 top.continew.starter.data.mybatis.plus.datapermission.DataPermissionFilter 接口,重写它的两个方法,并注入到 Spring 容器。

本项目中已经处理好了本部分内容。

java
public interface DataPermissionFilter {

    /**
     * 是否过滤
     *
     * @return true:过滤;false:不过滤
     */
    boolean isFilter();

    /**
     * 获取当前用户信息
     *
     * @return 当前用户信息
     */
    DataPermissionCurrentUser getCurrentUser();
}

使用注解

通过在 Mapper 接口方法上添加 @DataPermission 注解,指定数据过滤的关键信息。

本项目中已经提供了 DataPermissionMapper 来方便快速实现通用数据权限控制。

java
public interface DataPermissionMapper<T> extends BaseMapper<T> {

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

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

如果它不能满足你的需要,可以根据你的实际情况,在对应 Mapper 接口方法上配置 @DataPermission 注解信息。

字段描述默认值
value表别名(等价于 tableAlias)
tableAlias表别名
idIDid
deptId部门 IDdept_id
userId用户 ID(仅本人数据权限,必须确认配置此信息)create_user
roleId角色 ID(角色和部门关联表)role_id
deptTableAlias部门表别名sys_dept
roleDeptTableAlias角色和部门关联表别名sys_role_dept