Skip to content

DataScope 数据权限

在实际开发中,需要设置用户只能查看哪些部门的数据,这种情况一般称为数据权限。

例如对于销售,财务的数据,它们是非常敏感的,因此要求对数据权限进行控制, 对于基于集团性的应用系统而言,就更多需要控制好各自公司的数据了。如设置只能看本公司、或者本部门的数据,对于特殊的领导,可能需要跨部门的数据, 因此程序不能硬编码那个领导该访问哪些数据,需要进行后台的权限和数据权限的控制

快速上手

添加数据权限组件

xml
<parent>
	<groupId>com.hisense.pangea</groupId>
	<artifactId>pangea-common-datascope</artifactId>
	<!--该处使用当前最新版本号-->
	<version>${pangea.version}</version>
</parent>

配置数据权限开关

yaml
pangea:
  application:
    system-name: pangea  #系统名, 应与前端请求中的系统名一致
    data-scope-enabled: ${DATA_SCOPE:true} #数据权限开关, true/打开、false/关闭

注意

1、添加数据权限组件与配置数据权限开关为一次性操作 2、项目启动失败,需在启动类上面添加@MapperScan({"com.hisense.xx.*","com.hisense.pangea.datascope.mapper"})

开放数据权限同步接口权限

yaml
security:
  oauth2:
    ignore:
      urls:
        - /common/datascope/**

创建规则

点击「开发工具」应用,选择「菜单管理」,进入查询页面: 可以根据唯一键、权限名称以及状态进行模糊搜索查询,筛选出想要的数据

选择按钮类型为「菜单管理」的菜单,点击操作列的「数据规则」:

在数据规则弹出框中中点击「新增」可为该菜单新增数据规则,Pangea支持行数据权限和列数据权限两种数据规则的配置。

  • 行数据权限——控制列表中行的过滤与显示
  • 列数据权限——控制列表中列的隐藏、脱敏、显示。

行数据权限

名词解释

名词使用说明
规则名称自定义规则名称,命名规则应简洁易懂
规则字段数据库表字段的驼峰表现形式,例如,数据库字段为login_name, 此处需要填写loginName
规则条件分为大于(> xxx )、等于(= xxx)、小于(< xxx)、不等于(!= xxx)、大于等于(>= xxx)、小于等于(<= xxx)、左模('%xxx')、右模('xxx%')、包含('%xxx%')、 自定义SQL。 注:xxx为规则值
规则值类型分为自定义、当前登录人ID、当前登录人账号、当前登录人组织
自定义固定值,适合查询条件为固定的一个参数,比如,某用户不可以看到编号为50001的数据。
当前登录人ID动态值,【规则值】字段不可填。适合根据当前登录人的ID做行权限处理,比如某用户只能看到自己创建的数据
当前登录账号动态值,【规则值】字段不可填。适合根据当前登录人的账号做行权限处理,比如某用户只能看到与自己账号关联的数据
当前登录人组织动态值,【规则值】字段不可填。合适根据当前登录人查看自己所属组织下的数据。
规则值【规则值类型】为自定义时有效,固定值。
是否生效此规则是否有效

列数据权限

名词解释

名词使用说明
规则名称自定义规则名称,可以随意定义
规则字段数据库表字段的驼峰表现形式,例如,数据库字段为login_name, 此处需要填写loginName
规则条件分为隐藏、脱敏展示,选择脱敏展示选项,联动显示【脱敏规则】
脱敏规则为手机号、邮箱、卡号、地址、姓名
是否生效此规则是否有效

配置好之后点击【确认】,保存配置好的数据规则

角色关联规则

配置好的数据规则将会出现在角色管理中,需要前往角色管理中将角色与创建的数据规则进行关联绑定。

账号关联角色

角色设置好后,可前往用户管理中,将用户与角色进行绑定,该用户将拥有该角色下的数据权限。

数据规则扩展

如果上述描述满足不了您的需求,可前往数据权限扩展中,可以在业务服务中自定义扩展数据权限规则。

数据权限放行

正常状态下,Pangea会拦截所有的查询语句并匹配相关的数据权限。如果希望Pangea放行该查询语句,需要在Mapper中添加以下注解:
@DataScopeIgnore

java
public interface DemoMapper {
    
    //添加注解,注解方式只能使用在mapper的方法中
    @DataScopeIgnore
    List<Demo> selectList(Demo demo);
}

另一种方式为在application.yml文件中配置pangea.datascope.ignore,仅限mapper中的方法

java
pangea:
  #数据权限忽略拦截
  datascope:
    ignore:
      - com.hisense.pangea.system.mapper.OrganizationMapper.findAllByParentOrderBySortNum  #查询组织Tree
      # 查询已关联菜单
      - com.hisense.pangea.system.mapper.SysButtonsMapper.selectByPageCodeAndButCode
}

注意事项

  • @DataScopeIgnore作用域仅限Mapper中使用,仅是适应于select语句,对于insert语句中含有select的情况是不生效的;
  • 以ById结尾的查询方法数据权限不拦截,不需要在方法上添加@DataScopeIgnore
java
public interface DemoMapper {

    //此查询的方法名以ById为结尾,数据权限拦截器将自动忽略该查询语句。
    Demo selelctById(Long id);
}