Label Studio Enterprise SCIM 集成:用户与用户组自动化同步工作流及 API 指南
2026/9/13 0:53:52 网站建设 项目流程

Label Studio Enterprise SCIM 集成:用户与用户组自动化同步工作流及 API 指南

【免费下载链接】label-studioLabel Studio is a multi-type data labeling and annotation tool with standardized output format项目地址: https://gitcode.com/GitHub_Trending/la/label-studio

本文以 Label Studio Enterprise 的 SCIM(System for Cross-domain Identity Management,跨域身份管理系统)标准实现为主线,系统讲解如何通过 SCIM 实现用户/用户组的自动供给(provisioning)与回收(deprovisioning)、组织级与项目级角色映射、工作区成员自动分配,并完整给出 Users、Groups、Settings 三类 SCIM API 端点的调用方式与请求示例。读完本文,你将掌握在 Label Studio Enterprise 中基于 IdP(身份提供商)驱动的身份治理方案,以及如何通过Organization > SCIM页面或/api/scim/settings接口配置角色与工作区映射。

SCIM 在 Label Studio Enterprise 中的定位

SCIM 是一个开放标准,用于在身份域或 IT 系统之间自动化交换用户身份信息。它的设计目标是让云应用与服务中的用户管理更简单、更高效,从而减少用户管理所需的时间与资源。

对于使用 Label Studio Enterprise(LSE)的组织而言,SCIM 提供了一套流线化的用户身份与访问权限管理手段。通过集成 SCIM,管理员可以:

  • 自动化用户的供给(provisioning)与回收(deprovisioning);
  • 跨系统同步用户数据;
  • 确保正确的人员在 Label Studio Enterprise 内获得其所需的资源访问权限。

SCIM 的配置与 SSO 集成绑定在一起:在使用 SCIM 之前必须已经完成 SSO 配置(Okta、Microsoft Entra ID 等主流 IdP 的 SCIM 集成均基于 SSO 建立),并且需要一个与组织 Owner 角色绑定的 Legacy token 作为调用 SCIM 端点的凭据。完整的开通前置步骤与 Okta / Entra ID 分步配置向导见 scim_setup,本文专注于 SCIM 的工作流与 API 语义

需要说明的是,SCIM 能力属于 Label Studio Enterprise 功能(tier 标记为 enterprise),对应的 SCIM2 服务端实现基于 django-scim2 库构建,遵循 SCIM RFC 7644 中关于用户、组与查询过滤的标准定义。

SCIM 工作流:SCIM 能做什么

在 Label Studio Enterprise 中,通过 SCIM 你可以完成以下身份管理操作:

操作说明
添加用户IdP 侧分配应用后,SCIM 自动在 LSE 中创建对应用户
移除用户将用户角色置为Deactivated(撤销其 Label Studio 访问权限)
将用户分配到组通过 Group 资源的成员关系维护用户归属
将用户从组中取消分配移除 Group 资源中的成员条目
将组映射到用户角色组→角色的映射定义在 Label Studio 中,而非 IdP 中

关键设计要点是:组(Groups)本身定义在 IdP 中,Label Studio 并不创建组;但“组到角色”的映射规则定义在 Label Studio 内。也就是说,IdP 负责维护“谁属于哪个组”,Label Studio 负责解释“这个组拥有什么角色权限”,两者通过 SCIM 的 Group 资源与 LSE 的 SCIM 设置页联动。

这一联动在源码层面也有印证:在 label_studio/core/settings/base.py 中,成员/项目角色的来源枚举RoleSourceEnum明确包含了scim(与manualsamlldapapibilling并列),说明 SCIM 供给的角色在 LSE 内部是被单独记录来源(provenance)的,便于审计与追溯角色究竟由哪种方式赋予。

SCIM API 端点

Label Studio 的 SCIM 集成以/scim/v2/为根路径,控制并交互两类实体:Users(用户)Groups(用户组)。所有端点均使用 SCIM 2.0 标准语义。

Users(用户)端点

操作方法与路径说明
搜索用户GET /scim/v2/Users?filter=userName =<user@email.com>&startIndex=1&count=100用户存在返回200,不存在返回404
获取用户GET /scim/v2/Users/user@email.com以邮箱作为用户标识
创建用户POST /scim/v2/Users/需要包含用户信息的 payload,例如 email 与 password

搜索用户时使用 SCIM 标准的filter查询参数,userName在此处即用户的邮箱地址;startIndexcount用于分页控制。创建用户时,请求体(payload)必须携带用户的邮箱等身份信息:

{ "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"], "userName": "user@example.com", "emails": [ { "value": "user@example.com", "primary": true, "type": "work" } ], "active": true, "name": { "givenName": "Given", "familyName": "Family" } }

注意:在 SCIM 请求中 Label Studio 以email 作为用户的唯一标识字段。在 Okta 配置 SCIM 集成时,“Unique Identifier Field for Users”必须选择email而不是userName,否则对 SCIM 集成之前已存在的存量用户将无法正确匹配(详细说明见 scim_setup)。

Groups(用户组)端点

操作方法与路径说明
修改组成员PUT /scim/v2/Groups/<group-name>用完整成员列表替换组内成员
创建组POST /scim/v2/Groups/<group-name>在 LSE 中登记 IdP 同步过来的组
获取组GET /scim/v2/Groups/<group-name>查询组及其成员

修改组成员的请求体示例如下(<group-name>必须与 IdP 中发送的组名完全一致):

{ "BODY": { "schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"], "id": "<group-name>", "displayName": "<group-name>", "members": [ { "value": "<user@email.com>", "display": "<user@email.com>" } ] } }

PUT语义是全量替换:请求体中的members数组即为该组的最终成员列表,IdP 据此实现用户加入/移出组的同步。

SCIM 设置 API

除上述 SCIM 标准端点外,Label Studio 还提供专门的 SCIM 设置管理接口,用于配置“组→角色”与“组→工作区”的映射:

操作方法与路径
获取 SCIM 设置GET /api/scim/settings
更新 SCIM 设置POST /api/scim/settings

这两类设置同样可以在 Label Studio 应用内完成:进入Organization页面,点击右上角的SCIM即可打开设置界面,可视化地完成组到角色、组到工作区的映射配置(详见下文“SCIM settings”一节)。

SCIM settings:角色映射

通过组映射可以为用户分配角色。配置入口有两个:调用Update SCIM settings APIPOST /api/scim/settings),或登录 Label Studio 进入Organization页面后点击右上角的SCIM

组织级角色(Organization-level roles)

组织级可映射的角色包括AnnotatorReviewerManagerAdministrator。约束规则如下:

  • 每个组只能映射到一个组织级角色
  • 可以将组映射到Deactivated角色,从而撤销该组所有用户的 Label Studio 访问权限——这正是 SCIM“移除用户(deprovisioning)”在角色层面的落点;
  • 各角色的具体权限范围参见 Roles in Label Studio Enterprise。

各角色在 LSE 中的权限定位(摘自 admin_roles):

角色权限定位
Owner管理组织,拥有全层级完整权限;不可分配,每组织仅一位
Administrator拥有绝大多数层级的完整权限,可访问全部工作区与项目、邀请成员
Manager对其创建或被添加为成员的项目、工作区拥有完整管理权限,但无法访问 Organization 页面
Reviewer审阅已标注任务,只能查看分配了任务的项目并审阅/更新标注
Annotator标注任务,只能查看并标注分配了任务的项目

从源码看,Deactivated是组织角色枚举中的一等公民:在 label_studio/core/settings/base.py 中,OrganizationRoleEnum同时包含OW(Owner)AD(Administrator)MA(Manager)RE(Reviewer)AN(Annotator)DI(Deactivated)NO(Not Activated)VO(View Only)等取值,SCIM 供给的 Deactivated 状态即映射到该枚举。

项目级角色(Project-level roles)

若需要更细粒度的控制,可以为一个组分配项目级角色。可选值:

  • Annotator
  • Reviewer
  • Inherit:继承该组在组织级映射的角色

与组织级角色不同,一个组可以在多个项目上被分配多个角色。例如:Group A 在 Project 1 中是 Annotator,在 Project 2 中可以是 Reviewer。同样地,在 scim_setup 中还可以将一个组映射到多个项目、多个角色,或将多个组映射到同一个项目同一角色。

需要特别注意Inherit的一个边界行为:如果组继承的是Not Activated角色,用户会被映射到项目,但只有当该组完成同步(即用户完成首次认证)后,才会被真正指派到项目。

SCIM settings:工作区(Workspaces)

除了角色映射,SCIM 还可以将用户组分配到工作区;若指定名称的工作区尚不存在,SCIM 会自动创建。

  • 组被分配到工作区后,其成员即以工作区成员身份加入,默认获得该工作区内所有项目的访问权限;
  • 这些项目权限的默认值取决于组内用户的组织级角色
  • 如需覆盖默认行为,可以像上文所述使用 SCIM 为组分配项目级角色进行精确控制。

也就是说,工作区映射解决的是“可见范围”问题,组织级角色解决“默认能力”问题,项目级角色则用于“按项目覆盖能力”,三层映射叠加构成完整的 SCIM 授权体系。

从源码看 SCIM 在 LSE 中的落地机制

虽然 SCIM 服务端本身属于企业版闭源模块,但开源仓库中的若干实现细节可以帮助你理解 SCIM 请求在 LSE 内部的执行路径与影响:

  1. SCIM 请求的认证与会话隔离:在 label_studio/core/middleware.py 的会话超时中间件中,SCIM 请求会被标记为request.is_scim并从“用户活动”判定中豁免。注释明确指出“scim assign request.user implicitly, check CustomSCIMAuthCheckMiddleware”——SCIM 请求的用户身份由专用的认证检查中间件隐式指定,而不是依赖浏览器会话,因此 IdP 侧通过 Bearer Token 发起的定时同步不会被会话策略打断。

  2. 成员创建的统一关口:在 label_studio/organizations/models.py 中,Organization.add_user()是“所有成员创建(邀请、SCIM、SAML、LDAP、管理端)”都要经过的唯一入口(chokepoint),并对已关闭(closed)的身份账户拒绝新增任何成员资格。这意味着 SCIM 供给的用户最终也落在这个统一的成员管理模型上,与手动邀请的用户享受一致的组织成员语义。

  3. 角色来源可追溯:如前所述,RoleSourceEnum 将scim列为独立来源,说明系统可以区分“角色是手动、SAML、SCIM、LDAP、API 还是计费系统赋予的”,便于管理员审计 SCIM 自动供给对权限体系的影响。

  4. SCIM 相关功能开关:仓库的 feature_flags.json 中包含多个 SCIM 相关特性开关(如fflag_scim_skip_failed_membersfflag_fix_bros_1496_scim_stale_seats等),说明 SCIM 的供给行为(如失败成员的跳过策略、过期席位清理)受特性开关控制,在升级或排查同步问题时值得关注。

从工作流到落地:衔接配置与角色体系

要把本文的工作流真正跑起来,还需要与以下文档配合使用:

  • scim_setup:完整的 SCIM2 开通向导,包括 Okta 的 SCIM 连接器配置(base URL 指向https://<LABEL_STUDIO_BASE_URL>/scim/v2/、唯一标识字段必须为email、Bearer Token 认证)、Microsoft Entra ID(Azure AD)的受支持属性映射清单与属性白名单要求,以及组推送(Push Groups)流程;
  • auth_setup:SSO 前置配置,SCIM 依赖已建立的 SSO 集成;
  • access_tokens:SCIM 认证所需的 Legacy token 的获取与使用说明(注意 SCIM 请求头使用Bearer而非Token);
  • admin_roles 与 manage_users:组织级/项目级角色的权限矩阵,用于设计“组→角色”映射策略;
  • admin_manage_lse:用户账号管理的入口,SCIM 供给的用户同样在此体系内被管理。

典型落地路径:先在 IdP(Okta / Entra ID)中完成 SCIM 应用与属性映射配置 → 用 Owner 的 Legacy token 打通/scim/v2/认证 → 在 Label Studio 的Organization > SCIM页面(或POST /api/scim/settings)建立“组织角色映射 → 工作区映射 → 项目角色映射”三层规则 → 在 IdP 中推送组并分配用户。此后,IdP 中的任何组/成员变更都会通过 SCIM 自动同步到 Label Studio Enterprise,实现用户生命周期与权限的自动化治理。

【免费下载链接】label-studioLabel Studio is a multi-type data labeling and annotation tool with standardized output format项目地址: https://gitcode.com/GitHub_Trending/la/label-studio

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询