# 数据权限

在实际开发中,需要设置用户只能查看哪些机构、部门或者满足特定属性要求的数据,这种情况一般称为数据权限。 例如用户的详细信息是非常隐私的,因此要求对数据权限进行控制, 对于基于集团性的应用系统而言,就更多需要控制好各自机构的数据了。如设置只能看本机构、或者本部门的数据,对于特殊的领导,可能需要跨部门的数据, 因此程序不能硬编码那个领导该访问哪些数据,需要进行后台的权限和数据权限的控制。


提示

数据权限是针对于菜单页面的配置,而授权则基于角色。完整实现过程为:在需要做数据权限的菜单页面上配置数据权限场景,并完成角色授权。如角色未授权数据权限,则默认拥有授权菜单的所有数据权限

# 数据权限使用

# 1.概述

数据权限主要是通过注解 + AOP + 参数传递来实现。特此声明,方案中涉及到的拼接数据权限过滤sql等业务逻辑仅作为示例,开发人员可以根据自身业务进行调整

# 2.权限使用

# 2.1 注解@DataScope

/**
* <p>
* 数据权限过滤注解
* </p>
* @author cfyc
* @date 2022-04-27 09:30:00
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DataScope {

}

# 2.2 权限注解使用

权限注解@DataScope主要应用在mapper接口方法中,在调用mapper接口方法时,需要传递一个空的DataAuthParam对象,使用方式如下:

@Service
public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implements UserService {
        /**
         * 分页查询用户数据
         *
         * @author chengpeng
         */
        @Override
        public IPage<UserPageVO> selectPageUser(Page<User> page, UserPageDTO userPageDTO) {
            IPage<UserPageVO> userPageList = baseMapper.selectPage(page, userPageDTO, new DataAuthParam());
        }
}

public interface UserMapper extends BaseMapper<User> {
     /**
      * 分页查询 1的情况
     */
    @DataScope
    IPage<UserPageVO> selectPage(Page<User> page, @Param("userPageDTO") UserPageDTO userPageDTO, @Param("dataAuthParam") DataAuthParam dataAuthParam);
}

# 2.3 权限在xml中使用

在mapper接口方法上维护了权限相关操作以后(详情见权限注解使用),在xml文件中将dataAuthParam.dataScopeSql拼接到where条件最后,如下所示:

 <!--查询用户列表数据-->
    <select id="selectPage" resultMap="userListResultMap">
         distinct (u.id),u.login_name,u.name,u.is_actived,u.user_type from t_sys_user u
         <if test="userPageDTO.loginName!='' and userPageDTO.loginName!=null">
                     u.login_name like CONCAT('%',CONCAT(#{userPageDTO.loginName},'%'))
          </if>
         ${dataAuthParam.dataScopeSql}
        ORDER BY
        u.weight,
        u.create_time
     </select>

# 2.4 功能组件配置

使用功能组件数据权限时,前端需要在对应的ajax接口中的header中静态或者动态传入以component-code作为key值的组件编码,例如:

// 查询部门列表,包含父路径
export const selectDeptListPerm = (params) => {
    return {
        url: '/org/data-scope/search-list-contain-perm',
        method: 'get',
        params: params,
        headers:{"component-code":"org_dept_perm"}
    }
}

功能组件的编码查看以及维护是在数据字典中的数据权限菜单组件分类字典中查看和维护。

# 数据权限配置

# 1. 概述

数据权限管理模块负责对菜单维护数据权限配置。主要功能包含:新增修改查询删除查看导入导出数据日志数据生命周期

数据权限路径

# 2. 查询数据权限

数据权限页面左侧为菜单树,右侧为数据权限表格,支持根据数据权限编码、名称来查询。

查询数据权限

右侧分为上下两部,上部分为检索区域,支持数据权限的名称、编码模糊检索。下部分为数据权限分页表格。

查询数据权限

# 3. 新增数据权限

点击左侧菜单节点后,再点击新增按钮,打开新增数据权限窗口页面。

新增数据权限

页面编辑信息详见下文修改数据权限

# 4. 修改数据权限

点击数据权限表格行操作列编辑按钮,即可打开数据权限详情页面进行编辑操作。

编辑数据权限

数据权限编辑页面信息如下

属性名        属性说明
权限编码 数据权限编码,唯一标识
权限名称 数据权限名称
接口方法 需要做数据权限过滤的api方法名,如用户列表方法:/sys/user/select-page
备注 权限配置说明
规则值 规则配置,自定义。注意括号需要成对,支持多个条件的and、or连接,最后一行不可有连接,详细配置见下文

规则值的配置为可编辑表格。表格列属性如下

属性名        属性说明
括号 可为空,多条数据之间有复杂与或关系时需要选择。
权限字段 需要做过滤条件的权限字段,原sql如果有表别名,需要加别名。例如用户表别名为u,用户的机构id字段为:u.institution_id
类型 规则值的作用类型,见下文
作用域 作用域仅在类型为自定义数据权限类型时为可编辑状态。详细配置建下文作用域配置描述
条件 多条语句的与、或关系。单条规则时选择条件后不能保存,页面会提示规则不符合标准
括号 可为空,多条数据之间有复杂与或关系时需要选择。与第一列成对出现。不能缺少一半

规则值的作用类型包含七种状态,包含:全部可见本机构及以下机构可见本机构权限本部门及本部门以下可见本部门权限仅本人权限自定义数据权限

编辑数据权限

选择自定义数据权限时,作用域为可编辑状态。点击后打开弹窗,弹窗中包含多个类型的配置页签:指定字典值指定机构指定部门指定用户自定义值

编辑数据权限 编辑数据权限

  • 指定字典值时需要选择字典类型、字典值及填写比较符号。其中字典数据由平台字典模块提供。比较符号为:in。

    编辑数据权限

  • 自定义值时需要填写比较符号、比较值。比较符号包含常用的比较符:大于、小于、等于、in、like等。

    编辑数据权限

  • 指定机构时需要选择机构树节点,默认为in比较符。支持多选。

    编辑数据权限

  • 指定部门时需要选择部门树节点,默认为in比较符。支持多选。

    编辑数据权限

  • 指定用户时需要选择用户树节点,默认为in比较符。支持多选。

    编辑数据权限

# 5. 删除数据权限

勾选数据权限后,点击删除按钮,即可对数据权限进行批量删除。

删除数据权限

# 6.查看数据权限

点击表格行内的查看按钮,可以查看数据权限的明细内容。如下图所示:

查看字典

# 7.导入数据权限

数据权限提供表格的导入功能,点击导入下载模板,维护数据选择导入类型即可导入数据权限,详情参考导入流程

# 8.导出数据权限

数据权限提供表格的导出功能,点击导出按钮选择需要导出的字段,即可导出数据权限数据,详情参考导出流程

# 9.查看数据日志

数据权限提供数据日志的查询功能,点击数据日志按钮即可进入数据日志列表页面,详情参考数据日志

# 10.查看数据生命周期

数据权限提供生命周期的查看功能,勾选表格行选中框,点击生命周期即可查看该条数据的生命周期信息,详情参考生命周期