---
url: /v6.2/solutions-data-authority.md
---
# HENGSHI SENSE 数据权限解决方案

## 引言

### 编写目的

本方案主要讲述 HENGSHI SENSE 的数据权限方案，即在 HENGSHI SENSE 系统中，通过同步企业内部的人员属性和组织架构等信息，实现企业内部的每一个用户对于业务数据的读取权限。

本方案的的预期读者为：HENGSHI SENSE 的设计和开发人员、HENGSHI SENSE 的企业客户开发人员

### 背景

满足客户可根据业务系统数据权限对数据进行过滤。

### 术语表

| 序号 | 术语     | 解释                                                         |
| ---- | -------- | ------------------------------------------------------------ |
| 1    | 权限     | 用户对于资源的职权范围                                       |
| 2    | 功能权限 | 用户在 HENGSHI SENSE 系统上的操作权限                          |
| 3    | 数据权限 | 用户在 HENGSHI SENSE 系统上查看每一个报表时计算所基于的数据集合 |
| 4    | 用户属性 | 用户的自定义信息部分（用户属性/画像，用于筛选⽤用户群体，过滤数据），一般由企业客户同步到 HENGSHI SENSE，详见[同步接口](#同步接口) |
| 5    | 组织架构 | 企业的内部的组织结构信息，一般为树形结构，每个用户属于其中的某一个或多个节点|

## 概览

### 数据权限规则

\= 授权用户群体 + 数据过滤器

#### 授权用户群体的指定

* 通过指定具体用户
* 通过指定具体组
* 通过用户自定义属性指定

#### 数据过滤器的生成

* 在过滤器器中指定常量量过滤
* 在过滤器器中使用用户自定义属性过滤，例如：
* table1.区域 = $USER.区域
* table1.入职年年限 <= yeardiff($USER.入职时间,now())

#### 基于组织架构的数据权限规则

1. 业务数据表中含有组织架构相关的字段，比如部门 ID
2. 用户自定义属性中有组织架构相关的属性，比如所属部门 ID

### 数据权限控制的作用对象

* 数据连接中的表
* 已发布应用中的数据集

### 流程设计

流程设计原则:

* 降低系统间耦合
* 避免重复操作
* 只使用结果，避免实现逻辑拷贝，一方逻辑修改导致另一方也需同步修改

流程:

​  ![img](/images/topic/develop/data-authority-flow.png)

### 流程说明:

* 同步属性：API 调用/用户登录时，由 SSO server 传递该用户拥有哪些权限，如，部门 id 集合，组织 id 集合或者不能访问的 id 集合。传递的具体数据没有限制，根据业务需要由 SSO server 中决定传递哪些数据。hengshi 将 SSO server 中传递的这些属性保存到用户的属性中。
* 声明属性：在系统中声明用户属性，参考[用户属性声明](user-role.md#用户属性)
* 使用属性：在\[数据连接]->\[选择数据表]->\[权限控制]中进行设置，指定该表中的组织 id 或部门 id 字段，与用户属性中的权限属性进行匹配过滤。

例1:

* 用户 U 登录同步用户属性 org_id_set（值为 C 及 CC1，CC2的 id 集合），org_id_set=\["C","CC1,"CC2"]。
* 在系统中声明用户属性 org_id_set。
* 表 A 有公司 C，及子公司 CC1，CC2，及公司 D，E。设置表 A 的权限过滤 org_id 在用户属性 org_id_set 中(表 A.org_id in $USER.org_id_set)

那么根据权限过滤后，用户 U 可见的数据仅为 C，CC1，CC2的数据

## 数据结构

### 用户属性

#### 基本信息部分

[用户属性](https://api.hengshi.com/latest/user.html)，其中 config 字段是表示用户属性的 JSON 对象

## 同步接口

### API

通过 api 调用同步用户属性，参考[用户属性](https://api。hengshi。com/latest/user.html)

### SSO 登录认证时同步

1. 登录时，通过 sso server 传递用户属性，没有映射的字段会自动保存成用户属性，如：sso server 传递了3个字段，loginName，email，position，其中 loginName，email 映射到了用户的 loginName，email，position 没有任何映射，则会将 position 字段保存为用户属性。
   除用户名密码认证方式以外，其他认证方式处理逻辑一致。
2. 映射关系在认证方式页面配置，[映射的含义及说明](authorization.md#通用配置说明)。
   以 oauth 为例说明:

#### 示例 OAuth 登录传递用户属性

Oauth Server 返回值:

```json
{
  "login_name":"zhangsan",//用户名映射
  "name":"zhangsan",//显示名映射
  "email":"zhangsan@hengshi。com",//邮箱映射
  "roles":[ //角色映射
    "system admin",
    "data admin"
  ],
  "auths": [1,2,3],
  "leaderId": 1,
  "position": "manager"
}
```

其中没有映射的字段 auths，leaderId，position 自动保存到用户属性中，按照[流程说明](#流程说明)的步骤即可使用。

### 注意

1. 登录认证协议众多，以上的示例为 json 格式的，其他协议如 ldap，sso(cas，saml 等)或者第三方授权(钉钉，企业微信，飞书等)，都会根据协议传递的属性，将没有映射的字段信息保存成用户属性。
2. 对于传递用户属性不灵活的或者无法定制的，可以使用 API 的方式同步。
