Multitenancy & isolation
Hur Synapse isolerar data mellan användare och minds — säkerhetsgränser förklarade.
Multitenancy & isolation
Synapse är multitenant: flera användare, var och en med flera minds, fullständigt isolerade från varandra. Den här sidan förklarar isolationsmodellen.
Klienthierarki
Synapse Instance
│
├── User Account 1 (email: alice@example.com)
│ ├── Mind A (Mind Key mk_aaa...)
│ │ ├── Memories (only accessible via mk_aaa...)
│ │ ├── Tasks
│ │ └── Chat
│ └── Mind B (Mind Key mk_bbb...)
│ └── ... (isolated from Mind A)
│
├── User Account 2 (email: bob@example.com)
│ └── Mind C (Mind Key mk_ccc...)
│ └── ... (isolated from Alice's minds)
│
└── ... (more users)Isolationsnivåer
Nivå 1: Användarisolation
Varje användarkonto är isolerat. Alice kan inte:
- Se Bobs minds
- Komma åt Bobs minnen (även med sin JWT)
- Lista Bobs kontoinformation
Upprätthålls av: user_id-kolumn på alla tabeller, JWT innehåller user_id,
alla frågor filtrerar efter user_id.
Nivå 2: Mind-isolation
Inom en användare är varje mind isolerad. Mind A kan inte:
- Se Mind B:s minnen
- Komma åt Mind B:s uppgifter, chatt, skript
Upprätthålls av: mind_id-kolumn på alla datatabeller, Mind Key innehåller
mind_id, alla frågor filtrerar efter mind_id.
Autentiseringstoken
| Token | Omfattning | Vad den kan komma åt |
|---|---|---|
| Mind Key | Enskild mind | Endast den mindens data |
| JWT | Användarkonto | Kontohantering (skapa/lista/ta bort minds) |
| Computer Token | Enskild dator | Den datorns kommandon |
Åtkomst över mind-gränser
Inom samma användare
Användaren kan komma åt alla sina minds via JWT (t.ex. GET /minds listar
alla). Men för att läsa/skriva minnesdata behöver de specifik Mind Key.
Mellan användare
Användare kan inte komma åt varandras data — OM INTE de uttryckligen delar en mind via Sharing API:
# Alice shares Mind A with 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"}'Efter delning kan Bob komma åt Mind A via sin JWT (skrivskyddad om role=read).
Säkerhetsgränser
┌─────────────────────────────────────────────────┐
│ Synapse Instance │
│ ┌─────────────────────────────────────────┐ │
│ │ User Account Boundary │ │
│ │ ┌──────────────┐ ┌──────────────┐ │ │
│ │ │ Mind Bound. │ │ Mind Bound. │ │ │
│ │ │ (Mind Key) │ │ (Mind Key) │ │ │
│ │ │ │ │ │ │ │
│ │ │ Memories │ │ Memories │ │ │
│ │ │ Tasks │ │ Tasks │ │ │
│ │ │ Chat │ │ Chat │ │ │
│ │ │ Scripts │ │ Scripts │ │ │
│ │ └──────────────┘ └──────────────┘ │ │
│ └─────────────────────────────────────────┘ │
└─────────────────────────────────────────────────┘Vanliga multitenancy-mönster
Mönster 1: Enskild användare, enskild mind
Vanligast för enskilda LLM-agentanvändare.
- 1 användarkonto
- 1 mind
- 1 Mind Key
- Alla minnen i en omfattning
Mönster 2: Enskild användare, flera minds
För användare med flera kontexter (arbete, personligt, projekt).
- 1 användarkonto
- N minds (t.ex. "work", "personal", "project-x")
- N Mind Keys
- Varje LLM-session använder en Mind Key
Mönster 3: Team-delad mind
För team som samarbetar kring ett projekt.
- 1 användare skapar minden (får Mind Key)
- Skaparen delar med teammedlemmar via JWT
- Alla teammedlemmar kommer åt via JWT (eller delad Mind Key)
Mönster 4: SaaS-leverantör
För appar som bäddar in Synapse som sitt minneslager.
- Varje kund = 1 användarkonto
- Varje kundprojekt = 1 mind
- Appen lagrar Mind Keys per kund/projekt
- Full isolation mellan kunder
Verifiering av isolation
Test: Mind Key kan inte komma åt andra minds
# Mind A's key cannot read Mind B's memories
curl -H "Authorization: Bearer mk_aaa..." \
"https://synapse.schaefer.zone/memory/search?q=test"
# Returns only Mind A's memories
curl -H "Authorization: Bearer mk_bbb..." \
"https://synapse.schaefer.zone/memory/search?q=test"
# Returns only Mind B's memories (different results)Test: JWT kan inte läsa minnesdata direkt
# JWT can list minds
curl -H "Authorization: Bearer YOUR_JWT" \
https://synapse.schaefer.zone/minds
# Returns: list of minds
# JWT CANNOT read memories (need Mind Key)
curl -H "Authorization: Bearer YOUR_JWT" \
https://synapse.schaefer.zone/memory/recall
# Returns: 401 Unauthorized