成员与访问
- Asset
- ADP-PLN-FEAT-DOC-0033
- Feature
- project-members-and-access
- 领域
- plane-core
- 作用域
- application-level
- 文档状态
- draft
- 产品生命周期
- active
- 文档 Owner
- DOC
- 事实源
- canonical-docs
- 工程 Owner
- PLN
- Development Ready
- not-ready
- 更新
- 2026/10/14
FEATURE DEVELOPMENT PACKAGE
工程就绪状态
工程 Owner:PLN · 仓库:PLN
- 原子需求与验收
- 设计与工程合同
- 代码与仓库定位
- 里程碑与工作包
- 验证计划
- 无阻断决策
- Development Ready 已通过
- 验收标准已覆盖
- 正式测试已登记
- Fixture 与环境已定义
- 测试规格已物化到正式测试
- Verification Ready 已通过
- 实现修订可定位
- 发布证据已登记
- 兼容与迁移已定义
- Runbook 与回滚已定义
查看阻断项(5)
- Development Ready 缺少:原子需求与验收
- Development Ready 缺少:设计与工程合同
- Development Ready 缺少:代码与仓库定位
- Development Ready 缺少:里程碑与工作包
- Development Ready 缺少:验证计划
功能目标
管理 Project membership、Project Role 与默认成员设置。Active Project membership 是当前部门 v1 的 Project 访问事实。
功能结论
| 主题 | 当前结论 |
|---|---|
| 用户 | Project Admin 管理 direct members;Project Admin/Member 与 Workspace Admin 当前可进入成员设置页。 |
| 入口 | /{workspaceSlug}/settings/projects/{projectId}/members。 |
| 可见结果 | 查看 Project 成员和角色、默认成员设置、teamspace 关联;执行添加、角色变更、移除或自行离开。 |
| 当前系统保证 | Project Role 为 Admin(20)、Member(15)、Guest(5);ProjectMember 必须绑定 Project/Workspace/member;inactive membership 不参与当前访问。 |
| 明确不做 | Project membership 不由负责部门归属、Workspace Role、部门角色或 Producer approval 推导或替代。 |
| 权威 owner | 本页拥有 Project membership、Project Role 与当前 Project 访问 eligibility。 |
当前落地状态、已批准合同与差距
- 当前落地状态:当前 API 支持 Project member list/retrieve/create/update/remove/leave 和个人偏好;Web 设置页展示 defaults、teamspace 与 direct member list。
- 已批准合同:Project membership 是当前 Project 访问事实;不同层级角色不互相替代,负责部门归属不授予 Project 访问。
- 当前差距:Web 页面允许 Project Member 或 Workspace Admin 进入,但添加/移除/角色变更的按钮与 API 内部检查并非一份集中角色矩阵,需收敛为一致且可测试的合同。
- 后续交付:先固定 Project membership 与 role guard;不得用部门归属写回、替代或扩大 Project membership。
Project membership 与角色
ProjectMember 当前保存 project、workspace、member、role、is_active、preferences、sort_order 和审计字段;同一 active project/member 组合唯一。
| 行为 | 当前 source evidence |
|---|---|
| 添加成员 | Project Admin;目标必须先是 active Workspace member。 |
| 查看成员 | Project Admin/Member/Guest API 可读取,Guest 响应字段更受限。 |
| 修改角色 | 接口先验证 actor、目标角色、目标 Workspace Role 与自身角色层级。 |
| 移除成员 | Project Admin;不能用 remove API 移除自己,也不能移除更高角色。 |
| 自行离开 | 所有 Project roles 可请求;唯一 Project Admin 不能离开。 |
当前实现对 Workspace Admin 的旁路与普通 Project actor 的等级判断有特殊分支;这些是需要测试固定的实现事实,不应通过数值比较推断更多隐式权限。
访问来源与有效访问
当前 Project membership 是已落地的 Project 访问事实。目标 read model 必须区分:
- membership:由 Project Admin 显式添加、重新激活,或由独立 Project 访问 owner 投影为可解释来源;
- workspace/network:Project 列表可发现性,不自动等同 Project role;
- role:Admin / Member / Guest 等 Project 内行为权限。
部门主归属、部门角色或负责部门不能创建、提升、降低或删除 Project membership;若存在独立 Department Grant/Projection 能力,它只负责产生可解释的 Project membership/provenance,不改变部门工作项负责归属规则。
用户流程与系统响应
- Project Admin 打开成员设置,选择 active Workspace member 与目标 Project Role。
- 服务端复验 Workspace membership、Project identity、角色上下界和重复 membership。
- 已 inactive 的同一成员可被重新激活或更新;操作结果必须保持单一 active membership。
- 角色变更不能提升到 actor 无权授予的等级,也不能绕过 Workspace role 的硬边界。
- remove 将 membership 置 inactive;leave 由当前用户显式触发并保护最后 Admin。
- 成员变化对 assignee、负责部门、pending workflow 或 Automation 不做静默重写,由对应 owner 处理风险。
数据、API 与并发
目标稳定合同至少需要:
- project/workspace/member 三者同租户,目标用户为 active Workspace member;
- add/reactivate/update/remove/leave 具备确定的重复请求结果;
- 角色变更使用 expected membership version 或等价条件写;
- 最后有效 Project Admin 保护基于当前 active Project membership;
- 列表响应明确 Project membership 与 role,未落地来源不得伪装;
- member 失效时,工作项 assignee、部门路由和审批只标风险或进入显式处理,不自动改写历史。
跨层依赖
- Workspace 成员与角色提供 active Workspace membership 和上层角色。
- 分配与责任只能从有效 Project candidates 选择 assignee,不能自行授予访问。
- 项目管理拥有 Project network;network 只影响可发现性/进入策略,不成为无来源的 direct role。
异常与停止条件
- 非 Workspace member、跨 Workspace member id、inactive Project、权限不足或角色越权时 fail closed。
- 唯一 Project Admin leave/remove、并发角色冲突或 provenance 不可解释时停止。
- 成员移除会使开放工作项或审批失去有效负责人时,返回影响/风险,不静默重分。
验证与权威来源
- Web 路由:
apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/members/page.tsx - Web 列表:
apps/web/core/components/project/member-list-item.tsx - API:
apps/api/plane/app/views/project/member.py - 权限:
apps/api/plane/app/permissions/project.py、apps/api/plane/app/permissions/base.py - 模型与类型:
apps/api/plane/db/models/project.py、packages/types/src/project/projects.ts
真实验收需覆盖 Admin/Member/Guest、Workspace Admin、leave/remove 并发和最后管理员保护。
待决策问题
- Workspace Admin 是否无需 direct Project membership 即可执行全部成员管理动作?
- Project Member 对成员设置的可见字段和允许动作应到什么范围?
- 最后 Project Admin 保护在 Workspace Admin 旁路与 Project direct membership 共存时如何计算?