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);
}