# 用户权限模型的设计概念（初稿）
## 角色
- 阅读者：系统全体用户均为阅读者，可以作为图表/看板的分发对象，阅读分析者制作的图表/看板信息。
- 分析者：数据开放策略的对象为分析者，可以制作图表和看板，使用图表/看板分发策略将作品分发给指定用户（第三期预定：可以上传csv/xlsx作为数据源）。
- 管理员：系统部署后的根账号为始祖管理员，后续可以新增管理员；可以新增数据源，并使用数据开放策略将数据源开放给分析者，供分析者制作图表/看板。
    - 注：管理员同时也具有分析者的所有权限

## 策略
- 策略是本系统的核心概念，共有三种不同的类型：数据开放策略、图表分发策略、看板分发策略。
- 一条策略由策略对象和策略规则组成，策略对象确定该策略适用的对象，策略规则确定对策略对象进行开放/分发时的具体规则。
- 每条策略都可以单独设置是否启用，也可以删除单条策略；为操作方便，策略管理界面中可以点击按钮复制策略。
- 每个数据源都有一套`数据开放策略`，其策略对象决定了谁有权限查看并使用该数据源制作图表，策略规则决定了其获得的数据源开放的程度。
    - 创建数据源后会进行数据开放策略初始化：数据源创建者成为该数据源的第一条开放策略的策略对象，对应的策略规则是“所有数据”。
    - 数据源创建完成之后，创建者需进一步添加新策略将数据开放给系统中的分析者
    - 客户端尝试获取可用数据源列表时，服务端会验证该用户是否是分析者，验证失败则拒绝服务，验证成功则会查询对该分析者开放的数据源并形成列表返回。
    - 客户端尝试使用一个数据源时，服务端会验证请求者是否为该数据源的开放对象，验证失败则拒绝服务，验证成功则会获取对应的数据开放策略规则，对数据进行处理后返回。
- 每个图表都有一套`图表分发策略`， 其策略对象决定了谁有权限查看该图表，策略规则决定了其查看图表时对应的数据开放的程度。
    - 创建数据源后会进行图表分发策略初始化：图表的拥有者成为该图表的第一条分发策略的策略对象，对应的策略规则是“所有数据”。
    - 图表创建完成之后，拥有者需进一步添加新策略将图表分发给系统中的阅读者。
    - 客户端尝试获取可用图表列表时，服务端会查询分发给该阅读者的图表并形成列表返回。
    - 客户端尝试访问一个图表时，后端会验证请求者是否为该图表的分发对象，验证失败则拒绝服务，验证成功则会获取对应的图表分发策略规则以及该图表的拥有者所适用的数据开放策略，对数据进行处理后返回。
    - 备注：
        - 客户端访问图表时的数据形态相较于数据源经过了两次过滤处理：
            - 1)数据源开放给分析者时经过了数据开放策略规则处理； 
            - 2)图表分发给阅读者时经过了图表分发策略规则处理。
        - 基于这种设计，整个流程以继承的方式实现了对数据流动的控制：阅读者在图表中`最终所接触到的数据`是`对该图表作者开放的数据`的子集，而`对该图表作者开放的数据`是`该数据源所有数据`的子集
- 每个看板都有一套`看板分发策略`,其策略对象决定了谁有权限查看该图表，策略规则决定了其查看看板时对应的数据开放的程度。
    - 创建数据源后会进行看板分发策略初始化：看板的拥有者成为该看板的第一条分发策略的策略对象，对应的策略规则是“所有数据”。
    - 看板创建完成之后，拥有者需进一步添加新策略将看板分发给系统中的阅读者。
    - 客户端尝试获取可用看板列表时，服务端会查询分发给该阅读者的看板并形成列表返回。
    - 客户端尝试访问一个看板时，后端会验证请求者是否为该看板的分发对象，验证失败则拒绝服务，验证成功则会获取对应的看板分发策略规则以及该看板的拥有者所适用的数据开放策略，对数据进行处理后返回。
        - 备注：
        - 客户端访问看板时的数据形态相较于数据源经过了两次过滤处理：
            - 1)数据源开放给分析者时经过了数据开放策略规则处理； 
            - 2)看板分发给阅读者时经过了看板分发策略规则处理。
        - 基于这种设计，整个流程以继承的方式实现了对数据流动的控制：阅读者在看板中的某一个图表元素`最终所接触到的数据`是`对该图表作者开放的与该图表元素对应的数据`的子集，而`对该图表作者开放的与该图表元素对应的数据`是`与该图表元素对应的该数据源所有数据`的子集。
        - 此处考虑单个看板中的图表元素可能对应不同数据源的情况，每个图表元素的请求均相互独立；设计看板分发策略时，每个使用到的数据源都需要设置分发规则
        - 与请求图表时不同，每个图表元素请求数据时，服务端无需验证请求者是否是该图表对应元素的分发对象，而是验证该看板的拥有者是否该图表对应元素的分发对象。
            - 因此，看板分发到阅读者，只要看板的拥有者有正常查看对应图表的权限，阅读者应当能正常查看该图表元素，无需另行分发图表。


## 人员信息的导入与整理
1. 使用UAS的用户验证机制校验密码，并且获取用户对应的姓名、部门和岗位字段
2. 引入用户组概念，用户表下以用户组ID列表的方式标注其归属的用户组，一个用户可以属于多个组

## 用户组概念与管理
1. 系统部署后，自动设有一个根账号作为（原始）管理员（管理员也可以创建其他管理员），
2. 系统中每个用户都是`阅读者`；在此之上，管理员设置的数据分发策略的对象即为`分析者`(无需作另行判断)。
3. 为了实现系统的策略设计，系统引入了用户组的概念用于定位策略对象，由管理员管理用户组
4. 引入用户组概念后，设置策略对象时可以用以下方式筛选用户：
    1. 用户名/姓名
    2. 部门
    3. 部门 + 岗位
    4. 用户组
5. 勾选目标用户后可以批量加入或移出用户组

## 核心业务流程
1. 管理员配置好数据源后，管理员默认获得所有的权限
2. 管理员设计数据开放策略，将数据源分发给分析者
3. 分析者基于自己拥有的数据权限制作图表，然后设计图表分发策略将信息将图表分发给阅读者
4. 分析者基于自己制作的图表制作看板，然后设计看板分发策略将看板分发给阅读者

## 数据开放策略设计流程
1. 使用对象匹配器设置开放对象（分析者）：
    1. `注：需进一步讨论对象匹配器设计`开放对象由多条判断语句定义，每条判断语句匹配到具体的用户，最后取其与并集
    2. 判断语句中可以按照以下方式定位应用对象：
        1. 用户名
        2. 姓名
        3. 部门
        4. 部门 + 岗位
        5. 用户组
2. 设置开放策略：
    1. 数据开放策略由`行策略`和`列策略`组成。`(注: 第二期暂时不实装定义列策略）`
    2. 行策略由多条判断语句定义，以筛选的方式作用于当前的数据，最后取其交集
    3. 列策略由多选框定义，默认开放全部列，通过操作定向屏蔽列
    4. 可以引入部门/岗位/用户组作为变量用于编写判断语句
3. 备注：
    1. 根据常见场景需要，数据开放策略初始化后，创建者可以选择启用`“完全开放”`选项，启用后原有的策略不再生效，而是执行一条对象为全体而规则为所有数据的策略。
    2. 当管理员创建一个数据源却没有改动数据开放策略的话，提醒管理员“按照当前策略，只有管理员自己能够使用这个数据源。如果需要对其他人开放的话需要添加策略。”
    3. `注：第二期中只考虑适用单条开放策略的情况`~~若出现分析者适用多条数据开放策略的情况，其具体获得的数据取并集~~
        - ~~例如： 假设策略规定部门A的分析者只能获取部门A的数据、部门B的分析者只能获取部门B的数据， 若有员工既属于部门A也属于部门B， 则该员工能获取部门A和部门B的数据。~~


## 图表分发策略设计流程
1. 使用对象匹配器设置分发对象（阅读者）：
    1. `注：需进一步讨论对象匹配器设计`分发对象由多条判断语句定义，每条判断语句匹配到具体的用户，最后取其并集
    2. 判断语句中可以按照以下方式定位分发对象：
        1. 用户名
        2. 姓名
        3. 部门
        4. 部门 + 岗位
        5. 用户组
2. 设置分发策略：
    1. 分发策略只是行策略，没有列策略。
    2. 分发策略由多条判断语句定义，以筛选的方式作用于当前的数据，最后取其交集。
    3. 可以引入部门/岗位/用户组作为变量用于编写判断语句。
3. 备注：
    1. 分发对象打开图表后请求数据时，服务端验证请求者是否属于分发对象，若不属于则拒绝请求，若属于则获取对应的分发策略筛选条件和该图表拥有者适用的数据开放策略，对数据进行处理后返回。
    2. 当分析者创建一个图表却没有改动图表分发策略的话，提醒分析者“按照当前策略，只有你自己能够查看这个图表。如果需要分发给其他用户需要添加策略。”
    3. `注：第二期中只考虑适用图表分发策略的情况` ~~若出现阅读者适用多条图表分发策略的情况，其具体可阅读的图表取并集。~~
        - ~~例如： 假设策略规定部门A的阅读者只能阅读图表1、部门B的阅读者只能阅读图表2， 若有员工既属于部门A也属于部门B， 则该员工能获阅读图表1和图表2。~~


## 看板分发策略设计流程
1. 使用对象匹配器设置分发对象（阅读者）：
    1. `注：需进一步讨论对象匹配器设计`分发对象由多条判断语句定义，每条判断语句匹配到具体的用户，最后取其并集
    2. 判断语句中可以按照以下方式定位应用对象：
        1. 用户名
        2. 姓名
        3. 部门
        4. 部门 + 岗位
        5. 用户组
2. 设置分发策略：
    1. 分发策略由多条判断语句定义，以筛选的方式作用于当前的数据，最后取其交集
    2. 可以引入部门/岗位/用户组作为变量用于编写判断语句
3. 备注：
    1. 当分析者创建一个看板却没有改动看板分发策略的话，提醒管理员“按照当前策略，只有你自己能够查看这个看板。如果需要分发给其他用户需要添加策略。”
    2. `注：第二期中只考虑适用看板分发策略的情况`~~若出现阅读者适用多条看板分发策略的情况，其具体可阅读的看板取并集~~
        - ~~例如： 假设策略规定部门A的阅读者只能阅读看板1、部门B的阅读者只能阅读看板2， 若有员工既属于部门A也属于部门B， 则该员工能获阅读看板1和看板2。~~

# 辅助性流程
## 移交
- 当需要移除/注销/禁用用户时，需确保该账号下没有（作者为该账号的）图表；如果不想删除该图表，可以选择使用移交功能
- 当被移除/注销/禁用的用户是某个数据源的拥有者（例如需要转交管理员，或者用户有上传个人数据源），也需要先删除或移交数据源
- 移交数据源时，除了数据源的拥有者需要改变之外，应当自动触发一个流程将移交对象直接升级到开放所有数据的策略对象中。
    - 此处原拥有者不属于数据开放对象， 例如：A是原拥有者；A将数据源移交给B后，B成为拥有者，只有B在开放所有数据的策略对象中
    - 由于B已经成为拥有者，若有需要，B可以改变A所适用的数据开放策略。
- 此处数据源和图表的移交过程相互独立是为了充分解耦。如果过程中出现了权限问题，应由管理员去协调。

## 管理员兼任分析员
- 理论上管理员和分析员是解耦的，但实际情况中往往会出现管理员需要兼任分析员
- 此时管理员应当充分意识到自己拥有数据源的全部权限（数据源必然对其拥有者开放所有的数据），在分发图表/看板时妥善设计分发策略

## 管理员帮助分析员编辑其图表/看板
- 虽然管理员与分析员解耦，实际场景中往往会出现分析员制作的图表/看板无法正常工作的情况，此时管理员应当有权限强行通过认证修改图表（建议设计一个“技术支持模式”）
- 此时管理员能单独修改改图表对应的数据源的数据开放策略以及图表/看板分发策略，包括策略对象与策略规则。




# 界面元素和原型图（待更新）
### 数据开放策略设置界面
![数据开放策略设置界面-1](asset/image/dataAccess-UI.png)
![数据开放策略设计界面-2](asset/image/dataAccess-UI-2.png)

### 图表/看板分发策略设置界面
![数据开放策略设置界面-2](asset/image/distributeAccess-UI-2.png)


### 系统管理员 - 用户管理
![用户管理](asset/image/userManagement.png)




### 其他
- 数据源层面数据列的启用与否是为了排除无用字段，而数据开放策略中的列开放策略屏蔽与否是为了控制数据机密性
- 分析者对数据源无法操作，因此隐藏下拉菜单中属性设置的选项
- 除管理员外其他人没有添加数据库型数据源的权限，只能添加文件
- 除分发外应当有一个功能可以暂时性地直接通过链接授权访问，暂定名称为“共享”


##### BI系统接入UAS系统
用户注册时可以选择使用UAS账号注册（在UAS系统里相应的位置可以直接提供连接） 点击后验证UAS账号密码，验证通过后将部门岗位姓名等信息带过来储存于BI的用户系统
- 如果发生UAS内部门岗位信息变化的情况，可以请求同步信息





