通过 USIP 集成

GitHub在 GitHub 上编辑

Univer Pro 默认不内置账户体系。若需要身份认证、权限控制或与业务系统打通,请使用 USIP(Univer Server Integration Protocol)。USIP 是一种 SPI:由 Univer 定义接口,你的系统实现并响应。

适用场景

  • 访问需要登录鉴权
  • 需要按角色控制编辑权限
  • 同步协作者信息、评论展示、修改时间

接入流程

  1. 实现 USIP 接口(见下文“接口说明”)
  2. 在部署配置中开启 USIP
  3. 前端请求中透传认证信息(如 token)

USIP 接口说明

目前 USIP 分为三类:

  • 👥 账户类:身份认证、用户信息获取
  • 🔒 权限类:用户权限角色、文档协作者列表
  • 📄 文件类:文档最新修改时间通知

用户身份认证

调用场景

用户每次与 Univer Pro 后端服务交互都会调用。

交互流程

交互流程

协议定义

GET
Headers
透传用户传输的所有 header,保障你可以用于身份认证
No Parameters
Response
application/json
ParameterTypeExampleDescription
userObject-认证成功时,返回 user 对象
userIDstringace55655ceabd55用户的 ID,建议使用 open_uid
namestringalice用户名字,用于前端展示协作者信息
avatarstringhttps://image.xx/acde55acb45bbead55用户头像 URL,用于前端展示协作者信息
{  "user": {    "userID": "ace55655ceabd55g",    "name": "alice",    "avatar": "https://image.xx/acde55acb45bbead55"  }}

批量获取用户信息

调用场景

多人协作时展示头像和名字、评论列表展示作者信息。

交互流程

交互流程

协议定义

POST
Headers
无自定义 header,也不会透传用户请求的 header
Body Parameters
ParameterTypeExampleDescription
userIDsarray[string]["user_id1", "user_id2"]用户 ID 数组
{  "userIDs": [    "user_id1",    "user_id2",    "user_id3"  ]}
Response
application/json
ParameterTypeExampleDescription
usersarray[Object]-用户对象数组,结构同身份认证接口
{  "users": [    {      "userID": "user_id1",      "name": "name1",      "avatar": "https://xxxx"    },    {      "userID": "user_id2",      "name": "name2",      "avatar": "https://xxxx"    },    {      "userID": "user_id3",      "name": "name3",      "avatar": "https://xxxx"    }  ]}

用户权限角色获取

调用场景

用户读写文档时获取权限角色。

交互流程

交互流程

协议定义

GET
Headers
无自定义 header,也不会透传用户请求的 header
Query Parameters
ParameterTypeExampleDescription
userIDstringacd5455e44fc5bb55用户 ID
unitIDstringacff-adebc125e45b文档 ID
curl -X GET "http://sample.univer.ai/role?unitID=acff-adebc125e45b&userID=acd5455e44fc5bb55"
Response
application/json
ParameterTypeExampleDescription
userIDstringacd5455e44fc5bb55请求中的用户 ID
rolestringeditor角色:owner、editor、reader
{  "userID": "acd5455e44fc5bb55",  "role": "editor"}

获取文档的所有协作者

调用场景

在前端设置子表/保护选区权限时,需要获取协作者列表。

交互流程

交互流程

协议定义

POST
Headers
无自定义 header,也不会透传用户请求的 header
Body Parameters
ParameterTypeExampleDescription
unitIDsarray[string]["unit_id1", "unit_id2"]文档 ID 数组
{  "unitIDs": [    "unit_id1",    "unit_id2",    "unit_id3"  ]}
Response
application/json
ParameterTypeExampleDescription
collaboratorsarray[Object]-文档协作者对象列表
unitIDstringunit_id1文档 ID
subjectsarray[Object]-协作者列表
rolestringeditor角色:owner、editor、reader
subjectObject-协作者信息
typestringuser只能设置为 "user"
idstringacdef12555b12用户 ID
namestringalice用户名字
avatarstringhttps://image.ai/36554用户头像 URL
{  "collaborators": [    {      "unitID": "unit_id1",      "subjects": [        {          "subject": {            "id": "1",            "name": "alice",            "avatar": "https://image.ai/36554",            "type": "user"          },          "role": "owner"        },        {          "subject": {            "id": "2",            "name": "bob",            "avatar": "https://image.ai/36559",            "type": "user"          },          "role": "editor"        }      ]    }  ]}

通知文档最新修改时间

调用场景

用于业务侧展示文档更新时间等。

协议定义

POST
Headers
无自定义 header,也不会透传用户请求的 header
Body Parameters
ParameterTypeExampleDescription
unitIDstringacff-adebc125e45b文档 ID
editTimeUnixMsint1762591632345unix 时间戳(毫秒)
{  "unitID": "unit_id1",  "editTimeUnixMs": 1762591632345}
Response
application/json
ParameterTypeExampleDescription
{}

配置 USIP 接入

.env.custom
# usip about
USIP_ENABLED=true  # 设置为 true 以启用 USIP
USIP_URI_CREDENTIAL=https://your-domain/usip/credential # 配置好身份认证 USIP 的实现 URL
USIP_URI_USERINFO=https://your-domain/usip/userinfo     # 配置好用户信息获取 USIP 的实现 URL
USIP_URI_ROLE=https://your-domain/usip/role             # 配置好权限角色获取 USIP 的实现 URL
USIP_URI_COLLABORATORS=https://your-domain/usip/collaborators # 配置好协作者列表 USIP 的实现 URL
USIP_URI_UNITEDITTIME=https://your-domain/usip/unit-edit-time # 配置好接收文档修改时间 USIP 的实现 URL

USIP_APIKEY=

# auth about
AUTH_PERMISSION_ENABLE_OBJ_INHERIT=false  # 见下面权限设计说明
AUTH_PERMISSION_CUSTOMER_STRATEGIES=      # 见下面权限设计说明
values.yaml
universer:
  config:
    usip:
      enabled: true # 设置为 true 以启用 USIP
      uri:
        userinfo: 'https://your-domain/usip/userinfo' # 配置好用户信息获取 USIP 的实现 URL
        collaborators: 'https://your-domain/usip/collaborators' # 配置好协作者列表 USIP 的实现 URL
        role: 'https://your-domain/usip/role' # 配置好权限角色获取 USIP 的实现 URL
        credential: 'https://your-domain/usip/credential' # 配置好身份认证 USIP 的实现 URL
        unitEditTime: 'https://your-domain/usip/unit-edit-time' # 配置好接收文档修改时间 USIP 的实现 URL
      apikey: ''
    auth:
      permission:
        enableObjInherit: false # 见下面权限设计说明
        customerStrategies: '' # 见下面权限设计说明

注意:启用 USIP 后需配置全部 5 个接口,并确保你的系统正常响应。

如果你的 USIP 服务暴露在公网环境中,为了保证接口请求的安全性,我们可以参考 AI API 的鉴权方式。你可以生成一个 API key,并将其配置到 Univer server 中。当调用 USIP 接口时,请求会携带 x-api-key: API_KEY 的请求头,你可以通过该值来校验请求的合法性。

Univer 权限模型

Univer 使用 RBAC 模型,固定角色为 ownereditorreader。可以通过配置为某些权限点位设置最低角色。

默认权限点位与最低角色如下:

权限点位权限点位枚举值点位含义最低角色要求角色枚举值
ManageCollaborator2邀请 / 删除文档协作者owner2
Copy6拷贝文档内容reader0
Print3打印editor1
Duplicate4复制文档editor1
Share7分享给他人reader0
Export8导出editor1
Comment5评论reader0
View0阅读reader0
MoveSheet25移动 worksheeteditor1
DeleteSheet26删除 worksheeteditor1
HideSheet27隐藏 worksheeteditor1
CopySheet28复制 worksheeteditor1
RenameSheet29重命名 worksheeteditor1
CreateSheet30新增 worksheeteditor1
SetCellStyle33设置单元格样式editor1
SetCellValue34设置单元格值editor1
InsertHyperlink16插入超链接editor1
Sort17排序editor1
Filter18过滤editor1
PivotTable19透视表editor1
RecoverHistory43恢复文档到历史版本editor1
ViewHistory44查看文档历史记录reader0
SelectProtectedCells31选择被保护区域单元格editor1
SelectUnProtectedCells32选择非保护区域单元格editor1
SetRowStyle35设置行样式editor1
SetColumnStyle36设置列样式editor1
InsertRow37插入行editor1
InsertColumn38插入列editor1
DeleteRow39删除行editor1
DeleteColumn40删除列editor1
Delete42删除文档owner2
CreatePermissionObject45创建保护区 / 保护子表editor1

若希望仅允许 owner 复制与打印:

.env.custom
AUTH_PERMISSION_CUSTOMER_STRATEGIES=[{"action": 3, "role": 2}, {"action": 6, "role": 2}]

K8s 配置:

values.yaml
universer:
  config:
    auth:
      permission:
        customerStrategies: '[ {"action": 3, "role": 2}, {"action": 6, "role": 2} ]'

对象权限继承

默认情况下,文档的 owner 并不自动拥有该文档内所有“保护区/子表”的 owner 权限。若需要开启继承:

.env.custom
AUTH_PERMISSION_ENABLE_OBJ_INHERIT=true

K8s 配置:

values.yaml
universer:
  config:
    auth:
      permission:
        enableObjInherit: true

客户系统集成 USIP 实现示例

参考我们的 USIP 示例源码

前端配置自定义请求头

当你需要在请求中添加自定义 header(如 Authorization token)时,可使用 HTTPService 拦截器:

import { HTTPService } from '@univerjs/preset-sheets-core'

// 通过 Univer 实例获取 injector
const injector = univer.__getInjector()
// 添加自定义请求头
const httpService = injector.get(HTTPService)
httpService.registerHTTPInterceptor({
  priority: 0,
  interceptor: (request, next) => {
    // 在这里添加你需要的请求头
    // 例如添加 Authorization token:
    // request.headers.set('Authorization', 'Bearer your-token-here')
    return next(request)
  },
})
import { HTTPService } from '@univerjs/network'

// 通过 Univer 实例获取 injector
const injector = univer.__getInjector()
// 添加自定义请求头
const httpService = injector.get(HTTPService)
httpService.registerHTTPInterceptor({
  priority: 0,
  interceptor: (request, next) => {
    // 在这里添加你需要的请求头
    // 例如添加 Authorization token:
    // request.headers.set('Authorization', 'Bearer your-token-here')
    return next(request)
  },
})

如果使用了历史记录,也需要为 HistoryUniver 追加同样的拦截器:

historyLoaderService.historyUniver$.subscribe((historyUniver) => {
  if (!historyUniver) return

  const injector = historyUniver.__getInjector()
  const httpService = injector.get(HTTPService)
  httpService.registerHTTPInterceptor({
    priority: 0,
    interceptor: (request, next) => {
      // 在这里添加你需要的请求头
      // 例如添加 Authorization token:
      // request.headers.set('Authorization', 'Bearer your-token-here')
      return next(request)
    },
  })
})

完整示例可参考 Univer Pro Sheet 启动套件

你觉得这篇文档如何?