跳过内容

Access Control Reference

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

查看管理成员的仪表板视觉教程,请参见 组织.


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

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

一个成员可以持有 一个作用域目标的角色 —例如,一个组织角色,一个App A的角色,和一个App 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 预览app_preview组织和应用绑定的预览CI生命周期:上传捆绑包并创建预览频道。创建该频道会自动授予该频道的生命周期权限。

App 权限矩阵

App 权限矩阵
权限描述App 管理员App 开发者App 上传者App 阅读者
app.read查看应用详细信息、统计和元数据
app.update_settings编辑应用设置
app.read_bundles查看已上传的包列表
app.upload_bundle上传新包版本
app.create_channel创建新频道
app.read_channels查看频道
app.read_logs查看更新分发日志
app.manage_devicesAssign, override, or unlink 设备
app.read_devices查看设备列表
app.build_native触发本地云构建
app.read_audit查看应用级活动日志
app.update_user_roles管理应用范围角色分配
bundle.delete删除包

应用预览权限集

应用预览权限集

使用 应用预览 (app_preview)用于一个组织和应用绑定的CI密钥,该密钥管理PR预览周期,而不提供广泛的应用或组织级别访问权。

The app_preview 授予的绑定仅提供这些应用级权限:

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

当 App 预览密钥创建频道时,Capgo 将自动为该密钥创建一个新的频道的子绑定: channel_preview 权限

允许当 App 预览密钥创建频道时,__CAPGO_KEEP_0__ 将自动为该密钥创建一个新的频道的子绑定:
channel.read读取该关键创建的频道
channel.promote_bundle将该关键上传的包设置为该频道
channel.delete删除该频道

因为 app_preview 保留 app.read,因此该关键可能在选定的应用中枚举频道元数据。自动子绑定是一个 管理 界限:它不会为该关键没有创建的频道授予生命周期变更。

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

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


频道角色

频道角色

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

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

频道权限矩阵

频道权限矩阵
权限描述频道管理员频道浏览者频道预览
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 Reader 給予能力在頻道上關聯捆綁包,而不將其提升為 App Developer。 staging 角色層級


標題:角色層級

角色形成層級。父角色

繼承所有權限 的子角色 可以做任何一個 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上,并且 频道管理员 频道的 staging App B 的频道。
  • 当用户权限被评估时,所有他们的组成员身份都会透明地得到解决。如果他们的任何组授予所需的权限,访问将被允许。
  • 一个用户可以属于 多个组,并且所有组的权限都是累积的。
  • 组权限仅适用于 用户主体 — API 键不继承组角色。

何时使用组

何时使用组
场景没有组有组
5 名 QA 工程师需要对 3 个应用程序拥有开发者访问权限15 个单独的角色绑定1 个组 + 3 个角色绑定
有人加入 QA 团队手动添加 3 个角色绑定将他们添加到组
有人离开 QA 团队手动删除 3 个角色绑定将他们从组中删除

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

列出组

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

权限。 org.read_members 创建组

标题:创建组

终端窗口
所有组端点都需要身份验证,并在__CAPGO_KEEP_0__下提供
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>"

通过APIAssign角色

标题:通过APIAssign角色

成员列表

成员列表
终端窗口
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"
}'

组织列表

组织列表
终端窗口
npx @capgo/cli organization list --apikey <API_KEY>

成员列表

成员列表
终端窗口
npx @capgo/cli organization members <ORG_ID> --apikey <API_KEY>

自定义角色

自定义角色

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

继续阅读 Access Control Reference

标题:继续阅读 Access Control Reference

如果您正在使用 Access Control Reference 来规划仪表板和API操作,连接它到 API Overview 查看API Overview中的实现细节 简介 查看简介中的实现细节 API Keys 为API Keys的实现细节 设备 为设备的实现细节, 为包的实现细节。