Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

r-nacos数据权限方案设计与讨论 #175

Open
heqingpan opened this issue Nov 25, 2024 · 1 comment
Open

r-nacos数据权限方案设计与讨论 #175

heqingpan opened this issue Nov 25, 2024 · 1 comment

Comments

@heqingpan
Copy link
Collaborator

heqingpan commented Nov 25, 2024

数据权限方案设计

目标

r-nacos系统支持对不同访问者,根据其对应数据权限配置实现数据隔离功能。

1. 约束条件与规则

实现目标的方案会有多种。为了找到比较合适的方案,这里梳理补充了一些约束条件与规则,用于一些场景有多种选择时做判断。

  • 数据权限隔离不能和现有的SDK接口冲突,即SDK只依赖应用鉴权token可以完成数据隔离,不额外依赖其它参数。
  • 功能上尽量通用、实用、够用。
  • 数据隔离规则在满足功能前提下尽量简单,交互自然简单。
  • 新加的规则默认要和现有功能规则兼容,如果有冲突,需要用户配置后才能支持。

2. 场景分析

r-nacos包含注册中心与配置中心两部分内容。因为配置中心对数据权限更敏感,同时两者的维度也差不多;所以本方分析时只需以配置中心为准,后面注册中心使用其相同的方案即可。

Pasted image 20241125091522

目前的常用使用场景如上图:开发运维用户通过控制台管理应用配置,应用通过SDK OpenApi访问应用配置。

图中用户、应用、配置都有多个,我们可以考虑以用户、应用、配置为基本对象设计对应的数据隔离方案。

其中用户、配置在r-nacos已经是现有的对象,本次我们可以引入应用这个对象。
应用这个对象在现实中也是一个具体的容易理解的对象,建立用户与应用的数据访问关系应用拥有的配置关系,理论上即可确定数据隔离关系。

引入用户对象后,上面的场景逻辑上可以划分为:

Pasted image 20241125092505

场景分析后我们可以识别出3个主体对象:用户、应用、配置。

3. 核心对象关系分析与设计

3.1 配置

配置是nacos现有的模型对象,其的核心信息是配置主键与配置内容。

目前配置的联合主键是:命名空间 + 配置分组 + 配置ID ;

主键字段说明:

  1. 配置ID:一般当做配置文件名称;
  2. 配置分组:由使用者自定义的分组;
  3. 命名空间:一般用于环境隔离;

配置分组,是一个可自定义的抽象概念,所以我们可以考虑使用配置分组与应用建立关系。

3.1.1 配置与应用的关系

一个配置只有一个主应用,为了简单可以考虑应用与配置分组建立一个一对一关系,即配置分组值等于对应的应用名。
一个应用的配置可以共享给其它应用,应用配置共享关系单独维护,由应用管理员发起,并设置对应的共享读写访问权限。

3.1.2 配置与命名空间(环境)的关系

一个应用的配置,有多个环境,为了兼容现有的nacos配置模型,可以把命名空间当做应用环境。

一个用户需要同时拥有应用权限和环境(命名空间)权限,才能访问对应的配置数据。

3.2 用户

用户是nacos现有的模型对象,用于系统识别访问者并做权限隔离。

r-nacos目前只支持功能权限隔离,本次为了支持数据权限隔离,需要配合配置的数据权限隔离维度,分别维护用户与应用、用户与命名空间(环境)的权限。

3.2.1 用户与应用的关系

不同的用户可访问、操作的应用权限是不同的,这个可以认为是用户与应用关系中的属性类型信息不同。

那么用户与应用应该有哪些类型属性呢?

我们可以先识别主要的关系。

3.2.1.1 应用管理员

可以管理应用配置,同时可以管理应用成员。

3.2.1.2 应用成员

可以管理应用配置。

3.2.1.3 应用访客

只可以查询应用配置,不能编辑。

3.2.2 用户与命名空间(环境)的关系

一个用户可以有多个命名空间权限,用户管理中需要支持配置用户所拥有的命名空间权限列表。

  1. 为了兼容现在的逻辑,用户默认拥有所有命名空间权限。
  2. 支持设置用户命名空间白名单,开启后只支持用户访问在白名单里的配置数据;
  3. 支持设置用户命名空间黑名单;配合默认支持所有命名空间,可以排除访问指定的环境 配置数据;(比如对普通用户排除访问线上环境数据,其它环境都可以访问)

3.3 命名空间

用户是nacos现有的模型对象,本次没有调整其内容只延伸它的概念,把它当成应用环境,用于做环境数据隔离。

命名空间相关的关系在配置、用户部分以有描述,这里就不展开。

3.4 应用

应用是本次计划新增的模型。

可以把应用当成一种特殊的角色,用于做应用数据隔离。

通过建立用户与应用的关系,应用与配置的关系,可对用户实现按用户维度做数据权限隔离。

3.4.1 应用与用户的关系

其关系在用户部分已有对应描述,这里不展开。

应用与用户关系的管理,由用户管理员维护,可以考虑放在应用部分管理。

3.4.2 应用与配置的关系

定义上应用的id与配置分组id一致,不需要单据管理。

应用配置共享,可以由应用管理员维护,支持把本应用配置共享给其它应用,应用配置共享考虑放在应用部分管理。

3.5 主要模型实体与其对应关系

Pasted image 20241129225821

核心类图

上面分析的核心对象(用户、应用、命名、配置)与关系中,应用与配置、环境与配置默认关系是确定的,只要分别维护好用户与应用,和用户与环境(命名空间)关系,即可根据关系对用户访问的配置数据进行过滤。

image

@heqingpan
Copy link
Collaborator Author

heqingpan commented Dec 17, 2024

【2024-12-17 补充】

功能

数据权限的功能可以分为三大块:关系管理、控制台数据权限控制、接口数据权限控制;

大体的功能内容如下:

  1. 控制台支持管理核心对象关系;
    • 用户与命名空间关系管理:支持现有全局管理员角色(不限制命名空间,不限制应用),也支持普通用户指定命名空间白名单;这部分计划放在用户模块管理;
    • 应用管理:
      • 新增应用管理:支持设置应用基础信息
        + 应用成员管理(应用级别管理员、开发、访客);
      • 应用密钥管理
      • 在应用详情页支持按不同的环境(命名空间)管理指定应用下的配置内容;
  2. 控制台访问根据核心对象关系支持数据权限控制;
    1. 命名空间查询支持按权限过滤;
    2. 应用访问支持按权限过滤;
    3. 配置数据访问支持同时按应用与命名空间做权限控制
  3. sdk接口调用根据核心对象关系支持数据权限控制;
    1. 配置数据访问支持同时按应用与命名空间做权限控制
    2. openapi 支持使用应用密钥鉴权

设计大体基本完成,准备投入开发,一些内容可以在开发时再细化。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant