Skip to main content

多租户与隔离

Synapse 如何在用户与 Mind 之间隔离数据 — 详解安全边界。


多租户与隔离

Synapse 是多租户的:多个用户,每个用户可有多个 Mind,彼此完全隔离。本页说明隔离模型。

租户层级

Synapse 实例
  │
  ├── 用户账户 1 (邮箱: alice@example.com)
  │   ├── Mind A (Mind Key mk_aaa...)
  │   │   ├── 记忆 (仅可通过 mk_aaa... 访问)
  │   │   ├── 任务
  │   │   └── 聊天
  │   └── Mind B (Mind Key mk_bbb...)
  │       └── ... (与 Mind A 隔离)
  │
  ├── 用户账户 2 (邮箱: bob@example.com)
  │   └── Mind C (Mind Key mk_ccc...)
  │       └── ... (与 Alice 的 Mind 隔离)
  │
  └── ... (更多用户)

隔离层级

第 1 级:用户隔离

每个用户账户相互隔离。Alice 不能:

  • 查看 Bob 的 Mind
  • 访问 Bob 的记忆(即使有她的 JWT)
  • 列出 Bob 的账户信息

强制方式:所有表上都有 user_id 列,JWT 包含 user_id,所有查询按 user_id 过滤。

第 2 级:Mind 隔离

在同一用户下,每个 Mind 相互隔离。Mind A 不能:

  • 查看 Mind B 的记忆
  • 访问 Mind B 的任务、聊天、脚本

强制方式:所有数据表都有 mind_id 列,Mind Key 包含 mind_id,所有查询按 mind_id 过滤。

Mind Key 隔离是首要的安全边界。泄露的 Mind Key 会授予对该 Mind 数据的完全访问权限 — 但仅限该 Mind。

认证令牌

令牌 范围 可访问内容
Mind Key 单个 Mind 仅该 Mind 的数据
JWT 用户账户 账户管理(创建/列出/删除 Mind)
Computer Token 单台计算机 该计算机的命令

跨 Mind 访问

同一用户内

用户可通过 JWT 访问自己所有的 Mind(例如 GET /minds 列出全部)。但要读写记忆数据,需要具体的 Mind Key。

跨用户

用户之间不能互访数据 — 除非通过 Sharing API 显式共享某个 Mind:

# Alice 将 Mind A 共享给 Bob
curl -X POST https://synapse.schaefer.zone/sharing \
  -H "Authorization: Bearer ALICE_JWT" \
  -d '{"mind_id": "m_aaa", "email": "bob@example.com", "role": "read"}'

共享后,Bob 可通过他的 JWT 访问 Mind A(若 role=read 则只读)。

安全边界

┌─────────────────────────────────────────────────┐
│              Synapse 实例                       │
│  ┌─────────────────────────────────────────┐    │
│  │         用户账户边界                     │    │
│  │  ┌──────────────┐  ┌──────────────┐    │    │
│  │  │  Mind 边界   │  │  Mind 边界   │    │    │
│  │  │  (Mind Key)  │  │  (Mind Key)  │    │    │
│  │  │              │  │              │    │    │
│  │  │  记忆        │  │  记忆        │    │    │
│  │  │  任务        │  │  任务        │    │    │
│  │  │  聊天        │  │  聊天        │    │    │
│  │  │  脚本        │  │  脚本        │    │    │
│  │  └──────────────┘  └──────────────┘    │    │
│  └─────────────────────────────────────────┘    │
└─────────────────────────────────────────────────┘

常见多租户模式

模式 1:单用户,单 Mind

个人 LLM Agent 用户最常见。

  • 1 个用户账户
  • 1 个 Mind
  • 1 个 Mind Key
  • 所有记忆在同一范围

模式 2:单用户,多 Mind

适合有多种上下文的用户(工作、个人、项目)。

  • 1 个用户账户
  • N 个 Mind(例如 "work"、"personal"、"project-x")
  • N 个 Mind Key
  • 每个 LLM 会话使用一个 Mind Key

模式 3:团队共享 Mind

适合团队协作某个项目。

  • 1 个用户创建 Mind(获得 Mind Key)
  • 创建者通过 JWT 共享给团队成员
  • 所有团队成员通过 JWT 访问(或共享的 Mind Key)
共享 Mind Key 会授予完全读写权限。团队协作时,请优先使用 Sharing API(基于 JWT),而不是直接共享 Mind Key。

模式 4:SaaS 提供商

适合将 Synapse 作为记忆层嵌入的应用。

  • 每个客户 = 1 个用户账户
  • 每个客户项目 = 1 个 Mind
  • 应用按客户/项目存储 Mind Key
  • 客户之间完全隔离

隔离验证

测试:Mind Key 不能访问其他 Mind

# Mind A 的 key 不能读取 Mind B 的记忆
curl -H "Authorization: Bearer mk_aaa..." \
     "https://synapse.schaefer.zone/memory/search?q=test"
# 仅返回 Mind A 的记忆

curl -H "Authorization: Bearer mk_bbb..." \
     "https://synapse.schaefer.zone/memory/search?q=test"
# 仅返回 Mind B 的记忆(不同结果)

测试:JWT 不能直接读取记忆数据

# JWT 可以列出 Mind
curl -H "Authorization: Bearer YOUR_JWT" \
     https://synapse.schaefer.zone/minds
# 返回:Mind 列表

# JWT 不能读取记忆(需要 Mind Key)
curl -H "Authorization: Bearer YOUR_JWT" \
     https://synapse.schaefer.zone/memory/recall
# 返回:401 Unauthorized

最佳实践

下一步