多租户与隔离
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