角色与访问控制
Pier 的授权模型有两个作用域。每位用户都拥有一个全局角色,此外用户还可以在其作为成员的每个项目上拥有一个项目角色。大多数端点会检查其中之一;少数影响重大的端点则保留给 Owner。
全局角色存储在用户记录上,并随每个经过身份验证的请求一同传递。共有三种,按权限从高到低排列。
| 角色 | 可执行的操作 |
|---|---|
Owner | Admin 能做的一切,外加 Owner 专属的控制项:更改其他用户的全局角色、删除/提升 Admin、联邦授权以及 WireGuard 网格。设置时创建的第一个用户即为 Owner。系统始终要求至少有一个活跃的 Owner。 |
Admin | 管理用户(邀请、编辑、移除非 Owner 用户)、管理服务器、查看系统指标和审计日志、创建项目,以及操作 Docker 层面的资源(容器、镜像、compose 栈、网络、镜像仓库)。绕过项目成员身份检查 —— Admin 可以访问每个项目。 |
User | 普通成员。仅能看到自己明确作为成员的项目,外加只读的全局端点(服务器列表、系统指标)。无法创建项目或管理用户。 |
全局
Owner和Admin都会绕过项目成员身份检查 —— 在每个项目上,他们都被视为项目级Admin。
项目角色通过项目成员身份(project_members 表)授予,将一个 User 的权限范围限定在单个项目内,而不赋予其全局权力。共有三种。
| 角色 | 在项目内可执行的操作 |
|---|---|
Admin | Editor 能做的一切,外加管理项目成员身份(添加/移除成员、更改其角色)。 |
Editor | 部署和重新部署服务、更改环境变量、域名和设置、重启。 |
Viewer | 只读:配置、日志、指标和部署历史。 |
每个项目至少保留一个项目级 Admin:Pier 拒绝降级或移除最后一个 Admin。
端点如何受控
Section titled “端点如何受控”有两种机制强制执行角色:
- 路由级全局守卫。 整组路由位于中间件层之后。
require_global_admin守护用户管理、Docker 守护进程操作、compose 栈、镜像仓库、审计日志和服务器变更。require_global_owner守护全局角色变更(PUT /users/{id}/role)、网格和联邦授权。 - 处理器内项目检查。 项目级路由(资源、部署、环境变量、备份)在处理器顶部调用
enforce_project_role/enforce_resource_role,将资源解析到其所属项目并要求达到最低项目角色。
常见操作的简明对照表:
| 操作 | 最低角色 |
|---|---|
| 浏览目录 / 查看某项目的服务 | Viewer(项目) |
| 部署或重新部署服务、编辑环境变量/域名 | Editor(项目) |
| 添加或移除项目成员 | Admin(项目) |
| 创建新项目 | Admin(全局) |
| 邀请或移除用户、查看审计日志 | Admin(全局) |
将用户提升为 Admin,或更改任何全局角色 | Owner(全局) |
| 管理联邦授权或 WireGuard 网格 | Owner(全局) |