Skip to content

数据权限

数据权限组件包含数据权限管理及配置、数据权限拦截器两部分。通过数据权限管理及配置,可以为用户针对不同的菜单资源授予指定的数据权限范围。数据权限拦截器根据用户的数据权限,对请求的数据资源自动插入过滤sql,实现数据权限的控制。

使用说明

依赖引入

在不同的环境下引入以下依赖

xml
<!-- 单体下 -->
<dependency>
    <groupId>cn.zjtele.pubinfo.sys.rbac</groupId>
    <artifactId>rbac-api</artifactId>
    <version>${sys-rbac.version}</version>
</dependency>
<!-- 分布式下 -->
<dependency>
    <groupId>cn.zjtele.pubinfo.sys.rbac</groupId>
    <artifactId>rbac-extension</artifactId>
    <version>${sys-rbac.version}</version>
</dependency>

配置参数

yaml
pubinfo:
  data-permission:
    enable: true
    enable-strict: false
  • pubinfo.data-permission.enable 该配置表示是否开启数据权限控制,缺省后默认为true

  • pubinfo.data-permission.enable-strict 该配置表示是否开启严格模式,缺省后默认false

代码使用

在使用时需要申明进行数据权限拦截的方法以及拦截的具体字段,下面对使用的注解进行说明

@DataPermission注解

该注解的在dao层的mapper上使用,申明该mapper开启数据权限控制;

  • 注解参数 includeMethods是一个字符串数组。值代表需要进行数据拦截的方法名称
  • 注解参数defaultMenuCode,代表如果前端不传资源编码是,该mapper默认执行的资源编码code。

@DataPermissionField注解

该注解的在dao层的方法以及dao层返回对象上使用

  • 注解参数 userIdField是一个字符串。值代表需要进行用户id过滤的字段(需要带别名)
  • 注解参数 orgIdField是一个字符串。值代表需要进行组织id过滤的字段(需要带别名)

数据权限配置

查询当前数据访问,用户所具备的数据权限范围规则为如下:

  • 根据前端传入的资源编码(header传入),获取用户针对该资源的数据权限范围,并进行合并。
  • 如果当前资源用户未配置数据权限,则采用菜单资源配置的默认数据权限规则。
  • 如果该菜单资源未开启数据权限控制,则默认返回全部数据。

资源配置

资源(菜单、按钮、非菜单也)新增、编辑时,可以配置该菜单的默认数据权限,具体如下图:

数据权限管理

数据权限管理是为指定资源菜单配置对应的数据权限规则。相当于数据权限角色,该数据权限可以授予用户。

用户授权

为用户授予数据权限。

插件原理

技术原理

本插件基于mybatis的拦截器,通过拦截Executor后对@DataPermissionField注解中申明的两个字段值进行and in 条件的拼接。例如 @DataPermissionField(userIdField = "user.user_id", orgIdField = "org.id")在拦截后生成的sql为select * from user left join org on user.org_id = org.id where 业务条件 and user_id in ('','') and org.id in ('')

业务原理

数据权限模块有一系列的规则,例如:查看全部仅看自己仅看所在部门仅看所在部门及子部门仅自选部门自选部门及子部门指定群组等规则。但是这些规则细化到最底层就是对应数据的user_idorg_id两个字段。所以我们给用户授权了建立的数据权限,就相当于用户在查询对应数据时就有了两个in查询的范围。

严格模式说明

严格模式会校验请求头X-ResourceMark传输的值(实际为资源表的code),通过这个code值查询出对应的资源,然后来判断资源中的permission_code是否包含当前请求的path。如果不包含则校验不通过

高级使用

多个数据权限的合并自定义

用户调用接口时,改用户对该接口可能拥有多个数据权限的规则,那么这个时候就需要对数据权限的规则进行合并。本系统中的默认合并实现方式是将多个数据权限规则对应的用户id集合做并集操作、组织id集合做并集操作。 如果该合并方式不满足业务需求,可实现PubDataPermissionRuleMergeStrategy接口来自定义合并规则。