# Multi-tenancy & isolatie Synapse is multi-tenant: meerdere gebruikers, elk met meerdere minds, volledig geïsoleerd van elkaar. Deze pagina legt het isolatiemodel uit. ## Tenant-hiërarchie ``` 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) ``` ## Isolatieniveaus ### Niveau 1: Gebruikersisolatie Elk gebruikersaccount is geïsoleerd. Alice kan niet: - Bobs minds zien - Bobs herinneringen benaderen (zelfs met haar JWT) - Bobs accountinformatie tonen Afgedwongen door: `user_id`-kolom op alle tabellen, JWT bevat `user_id`, alle query's filteren op `user_id`. ### Niveau 2: Mind-isolatie Binnen een gebruiker is elke mind geïsoleerd. Mind A kan niet: - Mind B's herinneringen zien - Mind B's taken, chat of scripts benaderen Afgedwongen door: `mind_id`-kolom op alle datatabellen, Mind Key bevat `mind_id`, alle query's filteren op `mind_id`. > [!CRITICAL] > Mind Key-isolatie is de primaire beveiligingsgrens. Een gelekte Mind Key > verleent volledige toegang tot die mind's data — maar ALLÉÉN die mind. ## Authenticatie-tokens | Token | Bereik | Wat het kan benaderen | |-------|--------|-----------------------| | Mind Key | Eén mind | Alleen die mind's data | | JWT | Gebruikersaccount | Accountbeheer (minds aanmaken/tonen/verwijderen) | | Computer Token | Eén computer | Die computer's commando's | ## Cross-mind-toegang ### Binnen dezelfde gebruiker Gebruikers kunnen al hun minds benaderen via JWT (bijv. `GET /minds` toont allemaal). Maar om memory-data te lezen/schrijven, hebben ze de specifieke Mind Key nodig. ### Tussen gebruikers Gebruikers kunnen elkaars data niet benaderen — TENZIJ ze expliciet een mind delen via de Sharing-API: ```bash # 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"}' ``` Na het delen kan Bob Mind A benaderen via zijn JWT (alleen-lezen als `role=read`). ## Beveiligingsgrenzen ``` ┌─────────────────────────────────────────────────┐ │ Synapse Instance │ │ ┌─────────────────────────────────────────┐ │ │ │ User Account Boundary │ │ │ │ ┌──────────────┐ ┌──────────────┐ │ │ │ │ │ Mind Bound. │ │ Mind Bound. │ │ │ │ │ │ (Mind Key) │ │ (Mind Key) │ │ │ │ │ │ │ │ │ │ │ │ │ │ Memories │ │ Memories │ │ │ │ │ │ Tasks │ │ Tasks │ │ │ │ │ │ Chat │ │ Chat │ │ │ │ │ │ Scripts │ │ Scripts │ │ │ │ │ └──────────────┘ └──────────────┘ │ │ │ └─────────────────────────────────────────┘ │ └─────────────────────────────────────────────────┘ ``` ## Veelvoorkomende multi-tenant-patronen ### Patroon 1: Eén gebruiker, één mind Meest voorkomend voor individuele LLM-agent-gebruikers. - 1 gebruikersaccount - 1 mind - 1 Mind Key - Alle herinneringen in één scope ### Patroon 2: Eén gebruiker, meerdere minds Voor gebruikers met meerdere contexten (werk, persoonlijk, projecten). - 1 gebruikersaccount - N minds (bijv. "work", "personal", "project-x") - N Mind Keys - Elke LLM-sessie gebruikt één Mind Key ### Patroon 3: Team-gedeelde mind Voor teams die samenwerken aan een project. - 1 gebruiker maakt de mind aan (krijgt Mind Key) - Maker deelt met teamleden via JWT - Alle teamleden benaderen via JWT (of gedeelde Mind Key) > [!WARNING] > Het delen van een Mind Key geeft volledige lees/schrijftoegang. Voor teamsamenwerking > geeft u de voorkeur aan de Sharing-API (JWT-gebaseerd) boven het direct delen van Mind Keys. ### Patroon 4: SaaS-provider Voor apps die Synapse insluiten als hun memory-laag. - Elke klant = 1 gebruikersaccount - Elk klantenproject = 1 mind - App slaat Mind Keys op per klant/project - Volledige isolatie tussen klanten ## Isolatieverificatie ### Test: Mind Key kan andere minds niet benaderen ```bash # 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 geen memory-data direct lezen ```bash # 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 ``` ## Best practices > [!TIP] > - **Gebruik één mind per project/context** — isolatie is uw vriend > - **Deel nooit Mind Keys** — gebruik de Sharing-API in plaats daarvan > - **Roteer Mind Keys** indien gecompromitteerd (verwijder mind, maak nieuwe aan) > - **Controleer gedeelde minds** — bekijk periodiek `GET /sharing` > - **Gebruik JWT voor human-UI** — stel Mind Keys nooit bloot aan eindgebruikers ## Volgende stappen - [Authenticatie](/docs/getting-started/authentication) - [Mind Key vs JWT](/docs/getting-started/mind-key-vs-jwt) - [Architectuur](/docs/concepts/architecture)