Skip to content

Phase 44 — SCIM 2.0 Enterprise Provisioning 系统设计

版本: v1.0.0 创建日期: 2026-02-27 状态: ✅ 已实现 (v1.1.0-alpha)


一、模块概述

Phase 44 引入 SCIM 2.0 (System for Cross-domain Identity Management) 企业用户自动化配置系统,支持与 Azure AD、Okta、OneLogin 等 IdP 的双向同步。

1.1 核心目标

  1. SCIM 2.0 Server: RFC 7644 协议服务器,支持 User/Group 资源管理
  2. IdP双向同步: 增量同步,冲突解决,变更追踪
  3. Schema 管理: 属性映射,自定义 Schema 扩展
  4. 同步日志: 完整的同步历史和冲突记录

1.2 技术架构

┌──────────────────────────────────────────────────────┐
│              External Identity Provider (IdP)        │
│           (Azure AD / Okta / OneLogin)               │
└───────────────────────┬──────────────────────────────┘
                        │ SCIM 2.0 RESTful API
                        │ (GET/POST/PUT/PATCH/DELETE)
┌───────────────────────┼──────────────────────────────┐
│                       ▼                              │
│  ┌─────────────────────────────────────────────┐    │
│  │ SCIM Server                                 │    │
│  │ - /Users    endpoint                        │    │
│  │ - /Groups   endpoint                        │    │
│  │ - /Schemas  endpoint                        │    │
│  │ - /ServiceProviderConfig endpoint           │    │
│  └─────────────────────────────────────────────┘    │
│                       │                              │
│  ┌─────────────────────────────────────────────┐    │
│  │ SCIM Sync Engine                            │    │
│  │ - 增量同步 (lastModified tracking)          │    │
│  │ - 冲突解决 (IdP/Local/Latest优先)          │    │
│  │ - 变更追踪 (diff算法)                       │    │
│  └─────────────────────────────────────────────┘    │
│                       │                              │
│  ┌─────────────────────────────────────────────┐    │
│  │ Enterprise Org Manager (扩展)               │    │
│  │ - SCIM资源映射                              │    │
│  │ - 属性转换                                  │    │
│  │ - Schema管理                                │    │
│  └─────────────────────────────────────────────┘    │
└──────────────────────┬───────────────────────────────┘

┌──────────────────────┼───────────────────────────────┐
│                      ▼                               │
│  Database (Phase 44新增2张表)                        │
│  - scim_resources  (SCIM资源映射)                    │
│  - scim_sync_log   (同步日志)                        │
└──────────────────────────────────────────────────────┘

二、核心模块设计

2.1 SCIM Server

文件: desktop-app-vue/src/main/enterprise/scim-server.js

支持端点:

  • GET /scim/v2/Users - 列出用户 (过滤/排序/分页)
  • POST /scim/v2/Users - 创建用户
  • GET /scim/v2/Users/:id - 获取单个用户
  • PUT /scim/v2/Users/:id - 完整更新用户
  • PATCH /scim/v2/Users/:id - 部分更新用户
  • DELETE /scim/v2/Users/:id - 删除用户
  • GET /scim/v2/Groups - 列出组
  • POST /scim/v2/Groups - 创建组
  • GET /scim/v2/Schemas - 获取Schema
  • GET /scim/v2/ServiceProviderConfig - 服务提供商配置

API:

javascript
class SCIMServer {
  constructor(port = 9100, config = {})
  async start() // 启动服务器
  async stop() // 停止服务器
  async createUser(scimUser) // 创建用户
  async updateUser(scimId, scimUser) // 更新用户
  async deleteUser(scimId) // 删除用户
  async listUsers(filters = {}) // 列出用户
  async createGroup(scimGroup) // 创建组
  async updateGroup(scimId, scimGroup) // 更新组
}

2.2 SCIM Sync Engine

文件: desktop-app-vue/src/main/enterprise/scim-sync.js

同步策略:

  • IdP-First: IdP 数据优先 (默认)
  • Local-First: 本地数据优先
  • Latest-First: 最新修改优先 (lastModified比较)

冲突类型:

  • Both-Modified: 双方都修改 (需要策略)
  • Deleted-Modified: 一方删除,一方修改
  • Attribute-Conflict: 属性值冲突

API:

javascript
class SCIMSync {
  async syncUsers(direction = "bidirectional") // 同步用户
  async syncGroups(direction = "bidirectional") // 同步组
  async resolveConflict(conflictId, strategy) // 解决冲突
  async getSyncLog(filters = {}) // 获取同步日志
  async getSyncStats() // 同步统计
}

三、数据库设计

3.1 scim_resources (SCIM资源映射)

sql
CREATE TABLE IF NOT EXISTS scim_resources (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  scim_id TEXT NOT NULL UNIQUE, -- SCIM资源ID
  resource_type TEXT NOT NULL, -- User/Group
  local_id TEXT NOT NULL, -- 本地user_id或org_id
  external_id TEXT, -- IdP的externalId
  attributes TEXT NOT NULL, -- JSON (SCIM attributes)
  meta TEXT, -- JSON (created/lastModified/version)
  created_at INTEGER NOT NULL,
  updated_at INTEGER,
  INDEX idx_scim_resources_type (resource_type),
  INDEX idx_scim_resources_local_id (local_id)
);

3.2 scim_sync_log (SCIM同步日志)

sql
CREATE TABLE IF NOT EXISTS scim_sync_log (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  sync_id TEXT NOT NULL, -- 本次同步批次ID
  sync_type TEXT NOT NULL, -- user/group
  direction TEXT NOT NULL, -- push/pull/bidirectional
  status TEXT NOT NULL, -- success/partial/failed
  records_synced INTEGER DEFAULT 0,
  conflicts INTEGER DEFAULT 0,
  errors INTEGER DEFAULT 0,
  details TEXT, -- JSON
  started_at INTEGER NOT NULL,
  completed_at INTEGER,
  INDEX idx_scim_sync_log_sync_id (sync_id),
  INDEX idx_scim_sync_log_started_at (started_at)
);

四、IPC 接口设计

文件: desktop-app-vue/src/main/enterprise/scim-ipc.js

4.1 Server IPC (2个)

  • scim:start-server - 启动SCIM服务器
  • scim:stop-server - 停止SCIM服务器

4.2 Sync IPC (4个)

  • scim:sync-users - 同步用户
  • scim:sync-groups - 同步组
  • scim:resolve-conflict - 解决冲突
  • scim:get-sync-log - 获取同步日志

4.3 资源管理 IPC (2个)

  • scim:get-resource - 获取SCIM资源
  • scim:delete-resource - 删除SCIM资源

五、前端集成

5.1 前端页面

SCIMIntegrationPage.vue (/scim-integration)

功能:

  • IdP配置 (URL/Token/认证方式)
  • 资源管理 (User/Group列表)
  • 同步控制 (手动触发/定时同步)
  • 冲突解决 (可视化对比)
  • 日志查看 (同步历史/错误日志)

六、配置选项

javascript
scim: {
  enabled: false, // 默认禁用
  server: {
    port: 9100,
    hostname: "0.0.0.0",
    authType: "bearer", // bearer/basic/oauth2
    bearerToken: "",
    basicAuth: { username: "", password: "" }
  },
  idp: {
    type: "azure-ad", // azure-ad/okta/onelogin/custom
    scimBaseUrl: "",
    authToken: "",
    syncInterval: 3600 // 秒
  },
  sync: {
    conflictStrategy: "idp-first", // idp-first/local-first/latest-first
    enableAutoSync: false,
    retryAttempts: 3
  }
}

七、SCIM Schema 示例

User Resource

json
{
  "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
  "id": "2819c223-7f76-453a-919d-413861904646",
  "externalId": "user@example.com",
  "userName": "user@example.com",
  "name": {
    "formatted": "Alice Smith",
    "familyName": "Smith",
    "givenName": "Alice"
  },
  "emails": [
    {
      "value": "user@example.com",
      "type": "work",
      "primary": true
    }
  ],
  "active": true,
  "meta": {
    "resourceType": "User",
    "created": "2026-02-27T10:00:00Z",
    "lastModified": "2026-02-27T10:00:00Z",
    "version": "W/\"1\""
  }
}

八、安全考虑

  1. Bearer Token: 支持Bearer Token认证
  2. TLS加密: 生产环境强制HTTPS
  3. RBAC集成: 仅管理员可访问SCIM端点
  4. 速率限制: 100 req/min防止滥用
  5. 审计日志: 所有SCIM操作记录到audit_logs

九、测试覆盖

  • scim-server.test.js - SCIM服务器
  • scim-sync.test.js - 同步引擎

文档版本: 1.0.0 最后更新: 2026-02-27

ChainlessChain 系统设计文档 — 面向开发者