跳过内容

Access Control Reference

Capgo 使用 基于角色的访问控制 (RBAC) 来管理每个团队成员可以做什么。角色按 范围 — 从整个组织到单个捆绑包。

有关在仪表板中管理成员的可视化教程,请参见 组织.


每个角色都属于一个范围,决定它可以访问的资源。

范围适用范围示例用例
组织整个组织及其所有应用你的合伙人获得超级管理员;你的会计师获得账单管理员
应用一个应用及其通道一个开发者在一个应用上工作,得到App开发者
频道一个应用中的一个频道一个QA工程师只管理一个 staging 频道
打包一个打包版本一个审阅者需要对一个特定的发布有读取权限

一个成员可以在 一个范围目标 — 例如,一个组织角色,一个应用A的角色,和应用B的不同角色


组织角色

组织角色

这些角色在邀请成员时分配。它们授予对整个组织的访问权限。

角色内部名称描述
超级管理员org_super_admin拥有者等同。包括删除组织、管理账单和转移应用程序的完全控制。自动授予组织创建者。
管理员org_admin完全管理 — 管理成员、应用程序、频道。无法删除组织、更新账单、转移应用程序或将用户提升为超级管理员。
账单管理员org_billing_admin仅限账单访问:查看和更新账单信息、发票和账单审计日志。无应用程序或成员访问权限。
成员org_member只读访问组织及其所有应用。

组织权限矩阵

组织权限矩阵
权限描述超级管理员管理员账单管理员成员
org.read查看组织
org.update_settings编辑组织名称、Logo、管理邮箱
org.delete永久删除组织
org.read_members查看成员列表
org.invite_user邀请新成员
org.update_user_roles修改成员角色(管理员无法提升为超级管理员 — 角色层级阻止)
org.read_billing查看账单信息和当前计划
org.update_billing更新付款方式和计划
org.read_invoices查看发票
org.read_audit查看组织活动日志
org.read_billing_audit查看账单相关审计日志

仅限于一个应用。使用这些角色时,团队成员只应在一个应用中工作,而不是整个组织。

角色内部名称描述
应用管理员app_admin对一个应用程序有完全控制权 — 通道、设备、应用程序角色。无法删除或转移应用程序(这些是组织级别的操作)。
应用程序开发者app_developer上传捆绑包、管理设备、触发本机构建、更新通道设置。无删除、无应用程序设置更改、无通道创建。
应用程序上传者app_uploader读取访问 + 上传新捆绑包版本。
应用程序读者app_reader只读 — 统计、捆绑包、通道、日志、设备。
应用程序预览app_preview组织和应用程序绑定的预览 CI 生命周期:上传捆绑包并创建预览通道。创建该通道会自动授予生命周期权限,只有它。

应用程序权限矩阵

标题“应用程序权限矩阵”
权限描述应用管理应用开发者应用上传者应用浏览者
app.read查看应用详细信息、统计和元数据
app.update_settings编辑应用设置
app.read_bundles查看已上传的包列表
app.upload_bundle上传新包版本
app.create_channel创建新频道
app.read_channels查看频道
app.read_logs查看更新分发日志
app.manage_devices分配、覆盖或解除设备
app.read_devices查看设备列表
app.build_native触发本地云构建
app.read_audit查看应用级活动日志
app.update_user_roles管理应用级角色分配
bundle.delete删除一个捆绑包

应用预览权限集

应用预览权限集

使用 应用预览 (app_preview为一个管理 PR 预览生命周期而不提供广泛的应用或组织级访问的组织和应用绑定的 CI 密钥。

app_preview 绑定仅授予这些应用级别的权限:

权限允许
app.read读取所选应用
app.read_bundles读取上传的捆绑包
app.upload_bundle上传一个包
app.create_channel创建一个频道

当一个 App 预览密钥创建一个频道时,Capgo 会自动为该密钥创建一个子频道 channel_preview 绑定

权限允许
channel.read读取该密钥创建的频道
channel.promote_bundle将密钥的上传包设置到该频道
channel.delete删除该频道

因为 app_preview 保留 app.read,该密钥可能枚举在选定应用中的频道元数据。自动子频道绑定是 管理 边界:它不为一个由它自身创建的通道授予生命周期变更。

Capgo 记录了每个通道和每个捆绑的预览密钥。因此,一个 App 预览密钥可以创建它需要的每个非公共预览通道,推广自己的捆绑,并原子性地删除该通道和捆绑;但它不能对一个现有的默认/主通道、另一个预览密钥的通道或另一个密钥的捆绑进行这些操作。 channel delete --delete-bundle不包括

设备或角色管理 app.update_settings强制设备管理 channel.update_settings, channel.rollback_bundle通用 bundle.delete.


仅限于一个频道。有助于为特定发布频道提供定向访问。

角色内部名称描述
__CAPGO_KEEP_0__channel_admin对一个频道有完全控制权:设置、推广/回滚包、管理强制设备。
__CAPGO_KEEP_1__channel_reader只读 — 当前包、历史记录、强制设备、审计日志。
__CAPGO_KEEP_2__channel_preview系统分配到创建频道的 App 预览密钥:读取、推广自己的包、删除该频道。

__CAPGO_KEEP_3__

频道权限矩阵
__CAPGO_KEEP_4__描述__CAPGO_KEEP_5____CAPGO_KEEP_6__频道预览
channel.read查看频道及其当前包
channel.update_settings编辑频道设置(平台开关,更新策略…)
channel.delete删除频道
channel.read_history查看包分配历史
channel.promote_bundle在频道上设置活动包
channel.rollback_bundle回滚到之前的包
channel.manage_forced_devices强制特定设备使用此频道
channel.read_forced_devices查看强制设备列表
channel.read_audit查看频道活动日志

包角色

包角色

仅限于一个捆绑包版本。很少需要 — 大多数团队使用应用级别角色代替。

角色内部名称描述
捆绑包管理员bundle_admin读取、更新元数据和删除特定捆绑包。
捆绑包查看者bundle_reader只读访问特定包。

频道权限覆盖(控制台)

频道权限覆盖(控制台)

在控制台中,频道访问由用户的应用角色确定。为了获得更细致的控制,您可以 覆盖特定频道权限 覆盖特定频道权限

覆盖特定频道权限 覆盖 tab 中配置覆盖 查看 组织—覆盖频道权限

权限描述默认行为
读取查看频道及其当前包从应用角色继承
历史查看包分配历史从应用角色继承
关联包设置或更改频道的活动包继承自 app 角色

每个权限可以设置为:

  • 默认 — 从 app 角色继承(默认)
  • 允许 —Explicitly 授予,無論 app 角色
  • 拒绝 —Explicitly 拒绝,無論 app 角色

这让您可以,例如,给 App Reader 权限将包裹关联到频道,而不将其提升为 App Developer。 staging 角色层次结构


Section titled “角色层次结构”']}

targetLanguage

角色形成一个等级结构。一个父角色 继承了其子角色 的所有权限。这意味着一个 org_admin 可以做到一个 app_admin 可以做到的所有事情,后者可以做到一个 channel_admin 可以做到的所有事情,依此类推。

Super Admin (org_super_admin)
└── Admin (org_admin)
└── App Admin (app_admin)
├── App Developer (app_developer)
│ └── App Uploader (app_uploader)
│ └── App Reader (app_reader)
├── Bundle Admin (bundle_admin)
│ └── Bundle Viewer (bundle_reader)
└── Channel Admin (channel_admin)
└── Channel Viewer (channel_reader)

它是如何在实际中工作的:

  • 一个 组织级别的管理员 可以做到一个 应用程序管理员 该组织中的每个应用都可以。
  • 一个 应用管理员 在一个特定的应用中可以做到与 频道管理员 在该应用中的每个频道都可以做到。
  • 一个 应用开发者 可以做到与 应用上传者 可以做到的更多。

只有应用上传者才可以上传应用 向下 — 一种 channel_admin 即使他们还持有应用级别角色,也不会获得组织级别权限。


您可以创建 并将角色赋予组。组中的每个成员都会自动继承这些角色。

组的工作原理

标题:组的工作原理
  • 一个组属于 一个组织 — 不能跨越多个组织。
  • 组可以在任何范围内(组织、应用、频道或捆绑包)持有角色绑定。例如,一个组可以被赋予在应用A上的 应用开发者角色和在应用B频道上的 频道管理员 角色。 当用户权限被评估时,所有他们的组成员身份都会透明地被解析。如果他们的任何组授予所需的权限,访问将被允许。 一个用户可以属于 staging 多个组
  • Groups can hold role bindings at any scope: org, app, channel, or bundle.
  • For example, a group can be assigned the App Developer role on App A and the Channel Admin role on the channel of App B. When a user’s permissions are evaluated, all their group memberships are resolved transparently. If any of their groups grants the required permission, access is allowed.和所有组的权限是累积的。
  • 组权限仅适用于 用户主体 — API 键不继承组角色。
场景没有组有组
5 名 QA 工程师需要对 3 个应用程序拥有开发者访问权限15 个单独的角色绑定1 组 + 3 个角色绑定
某人加入QA团队手动添加3个角色绑定将他们添加到组中
某人离开QA团队手动删除3个角色绑定将他们从组中删除

通过API管理组

标题:通过API管理组

所有组端点都需要身份验证并在 /private/groups.

终端窗口
curl -X GET "https://api.capgo.app/private/groups/<ORG_ID>" \
-H "authorization: <API_KEY>"

需要 org.read_members 权限。

终端窗口
curl -X POST "https://api.capgo.app/private/groups/<ORG_ID>" \
-H "authorization: <API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"name": "QA Team",
"description": "Quality assurance engineers"
}'

需要 org.update_user_roles 权限(超级管理员管理员).

终端窗口
curl -X PUT "https://api.capgo.app/private/groups/<GROUP_ID>" \
-H "authorization: <API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"name": "QA Team",
"description": "Updated description"
}'
终端窗口
curl -X DELETE "https://api.capgo.app/private/groups/<GROUP_ID>" \
-H "authorization: <API_KEY>"

删除一个组也会删除所有其角色绑定。成员不会从组织中删除。

终端窗口
curl -X GET "https://api.capgo.app/private/groups/<GROUP_ID>/members" \
-H "authorization: <API_KEY>"

将成员添加到组

标题:添加成员到组
终端窗口
curl -X POST "https://api.capgo.app/private/groups/<GROUP_ID>/members" \
-H "authorization: <API_KEY>" \
-H "Content-Type: application/json" \
-d '{ "user_id": "<USER_UUID>" }'

用户必须已经是组织的成员。添加现有成员是无操作的。

从组中移除成员

标题:从组中移除成员
终端窗口
curl -X DELETE "https://api.capgo.app/private/groups/<GROUP_ID>/members/<USER_UUID>" \
-H "authorization: <API_KEY>"

通过 API 分配角色

标题:通过 API 分配角色
终端窗口
curl -X GET "https://api.capgo.app/organization/members" \
-H "authorization: <API_KEY>" \
-H "Content-Type: application/json" \
-d '{ "orgId": "<ORG_ID>" }'

响应:

[
{
"uid": "user-uuid",
"email": "alice@example.com",
"image_url": "https://...",
"role": "org_admin",
"is_tmp": false
}
]

邀请成员

邀请成员
终端窗口
curl -X POST "https://api.capgo.app/organization/members" \
-H "authorization: <API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"orgId": "<ORG_ID>",
"email": "bob@example.com",
"invite_type": "org_admin"
}'

接受的值 invite_type:

分配的角色
org_super_admin超级管理员
org_admin管理员
org_billing_admin账单管理员
org_member成员

移除成员

移除成员
终端窗口
curl -X DELETE "https://api.capgo.app/organization/members" \
-H "authorization: <API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"orgId": "<ORG_ID>",
"email": "bob@example.com"
}'

通过 CLI Assigning 角色

标题:通过 CLI Assigning 角色
终端窗口
npx @capgo/cli organization list --apikey <API_KEY>
终端窗口
npx @capgo/cli organization members <ORG_ID> --apikey <API_KEY>

自定义角色

自定义角色部分

内置角色覆盖了大多数团队结构。自定义角色创建将在我们的路线图上 — 如果您的团队需要这个功能, 联系我们。您的用例将直接帮助我们优先考虑这个功能。

继续访问控制参考

继续访问控制参考部分

如果您正在使用 访问控制参考 为计划仪表板和API操作,连接它 API概览 关于API概览的实现细节 简介 关于简介的实现细节 API密钥 关于API密钥的实现细节 设备 关于设备的实现细节 捆绑包 关于捆绑包的实现细节