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 核心目标
- SCIM 2.0 Server: RFC 7644 协议服务器,支持 User/Group 资源管理
- IdP双向同步: 增量同步,冲突解决,变更追踪
- Schema 管理: 属性映射,自定义 Schema 扩展
- 同步日志: 完整的同步历史和冲突记录
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- 获取SchemaGET /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\""
}
}八、安全考虑
- Bearer Token: 支持Bearer Token认证
- TLS加密: 生产环境强制HTTPS
- RBAC集成: 仅管理员可访问SCIM端点
- 速率限制: 100 req/min防止滥用
- 审计日志: 所有SCIM操作记录到audit_logs
九、测试覆盖
- ✅
scim-server.test.js- SCIM服务器 - ✅
scim-sync.test.js- 同步引擎
文档版本: 1.0.0 最后更新: 2026-02-27
