Files

13 KiB
Raw Permalink Blame History

2. 用户身份与 workspace 权限

用户身份确定谁在操作,资源归属确定操作的目标,权限确定允许进行哪些操作。平台用同一套身份与权限模型处理代码、基础内容和 agent;代码可视域另行决定声明在程序中的引用范围。

workspace 是资源的整体归属、协作和授权边界。namespace key 使用 workspace handle 定位这一边界,用户身份用于登录、判断操作权限和记录作者。w 表示编辑资源,x 表示使用已定义的程序能力,程序产生业务写入不要求调用者因此成为 Editor。

2.1 Workspace handle 与显示名

Workspace handle 是在平台内唯一定位 workspace 的名称,参与 namespace key。workspace 显示名用于界面展示,可以重复,不承担唯一定位职责。

属性 Workspace handle Workspace 显示名
用途 唯一定位 workspace 及其 namespace 面向用户展示名称
唯一性 在本平台内唯一 可以重复
参与 namespace key 是 否
示例 atelier 工作室

两个 workspace 可以都叫“工作室”,但其 handle 必须不同。例如 atelier 和 market 是两个 workspace;即使它们的显示名相同,其资源也分别定位。

用户账号与 workspace 是不同对象。一个用户可以参与多个 workspace,一个 workspace 可以有多个用户;资源地址不使用当前用户、管理员或作者的名字作为归属前缀。用户的登录标识及展示名称不决定资源 key,其具体形式见规范状态。

2.2 key 中的 workspace 部分

namespace key 由 workspace handle 与非空 namespace 路径组成:

workspace handle:namespace路径
atelier:shop.ui

冒号前的 atelier 是 workspace handle,不带 @ 前缀;冒号后的 shop.ui 定位该 workspace 内的 namespace。

key 归属 workspace namespace 路径
atelier:shop atelier shop
market:shop market shop
atelier:shop.ui atelier shop.ui

atelier:shop 与 market:shop 是不同的 namespace,即使它们具有相同的路径或相同的代码内容。

只有 workspace handle 不能构成 namespace key。独立登记的资源还需要至少一级 namespace,完整格式见namespace。workspace 本身的管理入口不由 namespace key 文法定义。

2.3 归属上下文

资源与 workspace 的归属通过代码之外的 key 与索引成员关系关联。读取、编辑和处理代码时,系统使用该归属上下文。

函数名、变量名、注释、字符串和存储对象名均不定义归属 workspace。两段内容相同的代码分别关联不同 workspace 时,其归属上下文仍然不同。

正文中的 use atelier:shop.pricing 表示引用目标,不表示当前代码属于 atelier。例如,market:shop.checkout 可以引用 atelier 的逻辑,其自身归属仍是 market。

2.4 归属 workspace、操作用户与作者

归属主体与用户身份承担不同职责:

身份 含义 关联对象
归属 workspace 资源位于哪个整体归属与授权范围 namespace key 与资源成员关系
操作用户 谁发起读取、修改或执行 本次操作的身份上下文
作者或修改者 谁编写或修改了代码 编辑或历史记录

例如 alice 与 bob 同属 atelier,bob 修改 atelier:shop 的代码时,操作用户和修改者都是 bob,资源仍归属 atelier。退出成员关系或更换管理员不会把资源自动转移到某个用户的个人 workspace。

Agent 或服务代用户操作时同样需要区分操作身份与目标归属。协作、委托和历史记录的具体规则参见规范状态。

2.5 Workspace 与平台用户系统

workspace 是一组资源共同归属、协作和授权的整体,包含 namespace、函数、class、agent 及独立保存的基础内容。用户拥有自己的账号,可以创建 workspace,也可以加入其他 workspace;成员关系不改变用户身份。

注册时创建用户账号,同时创建一个默认个人 workspace,并将注册用户设为该 workspace 的管理员。个人 workspace 和多人 workspace 使用同一模型,差别在于成员数量及其角色;个人 workspace 也可以邀请其他用户加入。

平台可以限制每个用户创建 workspace 的数量。加入已有 workspace 与创建新 workspace 是不同操作,数量上限、计数归属和删除后的额度恢复规则待定。

概念 职责 是否随协作者变化而变化
用户身份 认证操作用户、记录作者与修改者 每位用户独立存在
workspace 承担整体资源归属与权限边界 成员变动不改变资源归属
workspace handle 唯一定位 workspace 改名与历史引用规则需单独定义
namespace 在归属范围内组织和检索资源 不因加入一名成员自动增加一层路径

同一 workspace 中可以包含多组 namespace,各组共享 workspace 的授权边界。成员与资源的关系示意如下:

workspace:atelier
成员:alice、bob

atelier:shop.pricing
atelier:shop.data
atelier:shop.agents

alice 和 bob 编辑同一 workspace 的资源,作者记录各自的用户身份,资源仍归属 atelier。管理员变化或成员退出不要求重写 namespace 引用。默认 workspace 的 handle 如何生成、已有用户名 key 如何迁移,见规范状态。

2.6 r、w、x 的操作分工

三个权限字母表达资源操作的类别;具体角色及其授予范围在 2.7 的 workspace 模型中定义。

权限 允许的操作 不由该权限单独授予的能力
r:读取 浏览获准读取的代码、内容和资源视图 编辑资源、执行程序
w:编辑 创建、修改、删除资源内容或代码定义 修改成员角色、扩大授权
x:执行 调用已定义并允许外部使用的程序入口,取得契约允许的结果 任意改写实现源码或直接管理全部业务数据

w 与 x 的区别是编辑资源和使用程序。修改“提交订单”函数的定义需要 w;使用已经定义好的提交订单能力需要 x。该调用按业务契约保存订单,不要求调用用户获得函数源码的编辑权限。

同样,agent 在既定任务内执行获准业务操作与提交新的代码定义分别处理:使用 agent 的入口需要相应执行授权,向 namespace 保存或修改代码需要目标范围的 w。

程序的业务效果需要受定义好的操作范围、输入、业务条件及调用授权约束。x 不等于调用者获得管理员身份,也不表示能越过入口直接编辑任意资源。具体执行身份和运行能力如何关联仍待定义,不能用“有 x”推导出平台范围的无限授权。

读源码与使用软件可以分别授权。只有 x 的用户可以使用获准入口及调用所需的接口信息,而不因此获得完整实现源码的 r;接口信息的可见范围另行定义。读取函数不会自动运行它,执行后也只取得契约允许交付的结果。

高风险操作仍遵守人工在环等既定执行条件。执行授权与人类确认承担不同职责。

2.7 Workspace 角色与授权

平台按 workspace 记录用户的角色,用角色提供常用权限组合。角色只在对应 workspace 生效,用户在一个 workspace 是管理员,不表示其在其他 workspace 也拥有管理能力。

角色或访问状态 权限基线 管理能力
管理员 rwx 管理成员、角色及 workspace 设置
Editor rwx 编辑和使用资源,不管理授权
Reader r-- 浏览资源,不修改资源
无访问权限 --- 无

管理员与 Editor 的资源权限相同,但管理成员和授权属于管理员角色的管理能力,不增加第四个资源权限位。Editor 不能通过修改普通资源或编写函数为自己授予管理员角色。

Reader 是否附带 x,以及如何向不读源码的用户授予 --x,保留为 workspace 层面的共享与运行授权选择,不为每个函数增加一份独立权限表。未获得 r 与完全无访问权限是不同状态;执行用户可以具有 x 而不具有 r。

角色作用于整个 workspace 的资源,不为每个 namespace、class、字段或函数分别维护访问名单。需要不同协作和授权边界的资源放入不同 workspace,workspace 内通过 namespace 与代码可视域组织结构。

公开或未加入 workspace 的用户也不能仅凭 key 获得访问权。默认公开性、匿名访问以及运行授权的授予方式仍待定义。

2.8 权限边界与 namespace

workspace 是整体授权边界,namespace 是内部组织与检索范围。一个用户获得 workspace 的读取权限,可以在该范围内读取资源;读取某个 namespace 时包含哪些成员,仍由视图成员规则决定。

用户在 workspace 中的角色与授权
    → 允许的 r、w、x 操作
    → 定位目标 namespace 与资源
    → 按该操作和资源契约使用

第一级和后续 namespace 层级具有相同语义,不在每层重新配置权限。权限适用整个 workspace 不等于每次读取父 namespace 都自动合并全部下级内容;授权范围与视图成员范围是两个维度。

namespace key 是定位信息,不是访问凭据。知道 workspace handle 或 key,不等于获得读取、修改或调用其中声明的权限。

2.9 平台权限与代码可视域

平台权限回答“这个操作用户能对目标资源做什么”,代码可视域回答“这个声明能否在当前代码位置被引用”。程序引用或调用需要分别满足对应的可视域与操作权限;查看实现源码则依据读取授权判断。

情况 需要判断的规则
查看一个内部成员的源码 是否具有对应资源的读取权限
外部函数直接引用该内部成员 是否满足声明可见性和名称查找规则
导入并调用一个外部入口 是否可解析该入口,并具有对应执行授权
修改入口或内部成员实现 是否具有目标范围的编辑权限

允许阅读源码不自动允许外部代码引用全部内部成员;声明允许外部引用也不自动向所有平台用户授予权限。use 指定依赖来源,不产生授权。

可视域可以在 namespace、class 或 agent 等程序结构中定义,不要求为每个内部声明建立用户权限表。具体可见性关键字、默认可视域和跨 namespace 名称查找见程序结构与导入。

2.10 操作身份、作者与 Agent

归属主体是 workspace,操作用户和作者是用户身份。作者记录表达谁编写或修改资源,不决定本次操作的权限。

agent 声明位于哪个 workspace,不直接决定本次运行以谁的权限执行。agent 引用一段代码、由管理员编写,或作为某个 workspace 的成员资源存在,都不自动获得管理员的管理能力。

编辑操作检查目标范围的 w;入口调用检查对应的 x 及业务契约。跨 workspace 调用分别判断目标范围的执行授权。角色或授权信息不要求写进每个函数的参数,也不因 use 改变。

程序如何取得操作身份、业务执行能力的绑定和委托、agent 生成代码的提交接口,以及异步任务恢复时的授权检查,仍待定义。

2.11 名称比较与生命周期

创建、检索与改名必须使用一致的 workspace handle 相等判定。两个被判定为相同的 handle 不能同时指向不同 workspace。

workspace 显示名不参与 key,修改显示名不改变资源归属。handle 的变更涉及既有 key 与引用的定位;旧名称复用还涉及历史引用是否继续指向原 workspace。

workspace handle 的字符集合、大小写、Unicode 处理、改名、名称复用和归属转移的具体规则集中列于规范状态。本书示例使用简单的小写 handle 说明结构,不据此限定最终字符集。

管理员交接、成员移除、workspace 停用,以及账号注销后的资源保留仍需明确。成员变化与资源归属分开处理;新请求按当前授权判断,已经运行的调用、实例或任务如何受到授权变化影响另行定义。

2.12 外部模型参考

Linux 文件权限使用所有者、组及其他用户的读、写、执行位,提供了操作类别的参考;本章的 workspace 角色及 x 的程序入口语义由 Endorphin 自行定义。Linux inode 权限说明

Notion 将 workspace 成员关系与页面共享关联起来,提供了协作身份的参考。Endorphin 使用 workspace 整体授权,内部 namespace 负责组织资源。Notion 成员与访客说明

上一章:语言概览 · 下一章:namespace · 目录