# 2. 用户身份 用户身份是代码归属与 namespace 定位的基础。每个代码段必须关联一个归属用户,该用户以系统内唯一的用户名标识。 ## 2.1 用户名与显示名 用户名(handle)是用于定位用户的唯一名称,其作用类似社交平台的 `@` 名。显示名是用于界面展示的姓名或昵称,不承担唯一定位职责。 | 属性 | 用户名 | 显示名 | | ---------------- | ------------------ | -------- | | 用途 | 唯一定位用户及其 namespace | 面向读者展示名称 | | 唯一性 | 在本系统内唯一 | 可以重复 | | 参与 namespace key | 是 | 否 | | 示例 | `alice` | `林` | 两个用户可以同时使用显示名“林”,但其用户名必须不同。检索代码时使用用户名,不能以显示名替代。 用户名的唯一性限定在本系统的身份范围内。其他系统中相同的用户名不自动表示同一用户。 ## 2.2 key 中的用户部分 完整 namespace key 由用户名与非空 namespace 路径组成: ```text 用户名:namespace路径 alice:shop.ui ``` 冒号前的 `alice` 是用户名,不带 `@` 前缀;冒号后的 `shop.ui` 定位该用户名下的 namespace。 | key | 归属用户 | namespace 路径 | | --- | --- | --- | | `alice:shop` | `alice` | `shop` | | `bob:shop` | `bob` | `shop` | | `alice:shop.ui` | `alice` | `shop.ui` | `alice:shop` 与 `bob:shop` 是不同的 namespace,即使它们具有相同的路径或相同的代码内容。 只有用户名不能构成代码归属地址。代码必须同时属于至少一级 namespace,完整格式见[namespace](03-namespaces.md)。 ## 2.3 归属上下文 用户身份通过代码之外的 key 与索引成员关系关联。读取、编辑和处理代码时,系统使用该归属上下文。 场景名、变量名、注释、字符串和存储对象名均不定义归属用户。两段内容相同的代码分别关联不同用户时,其归属上下文仍然不同。 正文中的 `use alice:shop.pricing` 表示引用目标,不表示当前代码属于 alice。例如,`bob:shop.checkout` 可以引用 alice 的逻辑,其自身归属仍是 bob。 ## 2.4 归属用户、操作用户与作者 三种身份承担不同职责: | 身份 | 含义 | 关联对象 | | --- | --- | --- | | 归属用户 | 代码位于谁的 namespace | namespace key 与代码成员关系 | | 操作用户 | 谁发起读取、修改或执行 | 本次操作的身份上下文 | | 作者或修改者 | 谁编写或修改了代码 | 编辑或历史记录 | 在协作授权存在的情况下,操作用户可以与归属用户不同。例如 bob 获得修改 `alice:shop` 的权限后,修改行为不会将目标自动改归 `bob:shop`。 Agent 或服务代用户操作时同样需要区分操作身份与目标归属。协作、委托和历史记录的具体规则参见[规范状态](../appendices/specification-status.md#身份与权限)。 ## 2.5 身份与访问权限 namespace key 是定位信息,不是访问凭据。知道用户名或 key,不等于获得读取、修改或调用其中声明的权限。 代码归属与访问控制分别处理:归属确定目标,授权确定本次操作是否允许。代码默认公开性、跨用户可见性及权限继承规则不由 key 的结构推导。 ## 2.6 名称比较与生命周期 注册、检索与改名必须使用一致的用户名相等判定。两个被判定为相同的用户名不能同时指向不同用户。 显示名不参与 key,修改显示名不改变代码归属。handle 的变更涉及既有 key 与引用的定位;旧名称复用还涉及历史引用是否继续指向原用户。 用户名字符集合、大小写、Unicode 处理、改名、名称复用、账号停用和归属转移的具体规则集中列于[规范状态](../appendices/specification-status.md#身份与权限)。本书示例使用简单的小写用户名说明结构,不据此限定最终字符集。 [上一章:语言概览](01-overview.md) · [下一章:namespace](03-namespaces.md) · [目录](../README.md)