Безопасная multi-tenancy в Lino
Multi-tenancy ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ², ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ ΠΈΠ»ΠΈ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ, ΡΠΎΡ
ΡΠ°Π½ΡΡ Π΄Π°Π½Π½ΡΠ΅ ΠΈ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΈΠ·ΠΎΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌΠΈ. Π Lino Tenant ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΡΡΡ ΠΊΠ°ΠΊ ΡΠ°ΡΡΡ ΠΏΠΎΡΠΎΠΊΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ: ΡΡΠ½ΠΊΡΠΈΡ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΠΎΡΠ½ΠΎΠ²Ρ tenancy, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ Tenant ΠΏΠΎ subdomain, host ΠΈΠ»ΠΈ slug ΡΠ΅ΡΠ΅Π· ITenantContext ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎ JWT, ΡΠ΅ΡΠ΅Π· IUserContext.
JWT ΡΠ°ΠΊΠΆΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ TenantId, Π΄Π»Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π±ΡΠ» Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½. Lino ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅Ρ ΡΡΠΎΡ Tenant Ρ Tenant, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌ Π΄Π»Ρ Π·Π°ΠΏΡΠΎΡΠ°, ΠΏΠΎΡΡΠΎΠΌΡ ΡΡΠ° ΡΡΡΠ°Π½ΠΈΡΠ° ΡΠΎΡΡΠ΅Π΄ΠΎΡΠΎΡΠ΅Π½Π° Π½Π° ΡΠΎΠΌ, ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ ΡΠ΅ΡΠΈΡΡ ΠΏΠΎΡΠ»Π΅ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΡ ΡΡΠΎΠΉ ΠΎΡΠ½ΠΎΠ²Ρ: ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΡΠ½ΠΎΡΡΠ΅ΠΉ, ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΏΠΎ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡΠΌ ΠΈ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ
Π°Π±ΡΡΡΠ°ΠΊΡΠΈΠΉ.
ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ Tenant
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡ Tenant, ΠΊΠΎΠ³Π΄Π° ΡΠΈΡΡΠ΅ΠΌΠ° ΡΠ²Π»ΡΠ΅ΡΡΡ SaaS ΠΈΠ»ΠΈ ΠΊΠΎΠ³Π΄Π° Π΄Π°Π½Π½ΡΠ΅ ΡΠ°Π·Π½ΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠΎΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°ΡΡ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π±Π΅Π· ΡΡΠ΅ΡΠ΅ΠΊ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°ΠΌΠΈ.
lino feature tenant add
ΠΡΡΠΈΡΡΠ΅Π½Ρ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΠΎΡΠ½ΠΎΠ²Ρ Π΄Π»Ρ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ Tenants, ΡΠ²ΡΠ·ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ Tenant, ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½ΠΈΡ ΡΠ΅ΡΠ΅Π· ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ Ρ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠ΅ΠΉ. ITenantContext ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ Tenant, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΉ ΠΏΠΎ subdomain, host ΠΈΠ»ΠΈ slug, Π° IUserContext ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎ JWT, Π²ΠΊΠ»ΡΡΠ°Ρ TenantId, Π΄Π»Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΎΠ½ Π±ΡΠ» Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½.
ΠΠΎΡΠ»Π΅ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΡΠ΅, ΠΊΠ°ΠΊΠΈΠ΅ ΡΡΡΠ½ΠΎΡΡΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ Tenant, Π° ΠΊΠ°ΠΊΠΈΠ΅ ΡΠ²Π»ΡΡΡΡΡ global. ΠΡΠ° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°ΡΡΡΡ ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΎΠ΄ΡΠΊΡΠ°: multi-tenancy β ΡΡΠΎ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΈΡΡ Tenants, Π½ΠΎ ΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π°, ΡΠΊΡΠ°Π½Ρ, ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ, Π΄Π°Π½Π½ΡΠ΅ ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π·Π°Π²ΠΈΡΡΡ ΠΎΡ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ Tenant, ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½Π½ΠΎΠ³ΠΎ Lino.
- Tenant-scoped: Π·Π°ΠΊΠ°Π·Ρ, ΠΏΡΠΎΠ΄ΡΠΊΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ, ΠΊΠ»ΠΈΠ΅Π½ΡΡ CRM ΠΈΠ»ΠΈ Π»ΡΠ±ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅, ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°ΡΠΈΠ΅ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΉ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ.
- Global: ΠΏΡΠ±Π»ΠΈΡΠ½ΡΠΉ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ, ΠΏΠ»Π°Π½Ρ, Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠ΅ ΡΠ΅ΡΡΡΡΡ, Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΈΠ²Π½ΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΈΠ»ΠΈ Π΄Π°Π½Π½ΡΠ΅, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ Π΄ΠΎ Π²ΡΠ±ΠΎΡΠ° Tenant.
- Hybrid: global Π΄Π°Π½Π½ΡΠ΅ Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠΎΠΉ ΠΏΠΎ Tenant, ΡΡΠ΅Π±ΡΡΡΠΈΠ΅ ΡΠ²Π½ΠΎΠ³ΠΎ ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΡΡΠΎΠ±Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠ³ΠΎ Π΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈΠ»ΠΈ ΡΡΠ΅ΡΠΊΠΈ ΠΏΡΠ°Π²ΠΈΠ».
Π ΠΌΠΎΠ΄ΡΠ»ΡΠ½ΠΎΠΌ ΠΌΠΎΠ½ΠΎΠ»ΠΈΡΠ΅ ΠΌΠΎΠ΄ΡΠ»Ρ tenancy ΠΎΠ±ΡΡΠ½ΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ Π²Π»Π°Π΄Π΅Π»ΡΡΠ΅ΠΌ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΡΠ½ΠΎΡΡΠΈ Tenant. ΠΡΡΠ³ΠΈΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ catalog ΠΈΠ»ΠΈ CRM, Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ ΠΊ ΡΡΠΎΠΉ ΡΡΡΠ½ΠΎΡΡΠΈ Π½Π°ΠΏΡΡΠΌΡΡ. ΠΠΎΠ³Π΄Π° ΠΈΠΌ Π½ΡΠΆΠ½ΠΎ Π·Π½Π°ΡΡ Tenant, ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡΡ Ρ ΡΠ°Π½ΠΈΡΡ shadow entities Ρ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠΌΠΈ ΠΏΠΎΠ»ΡΠΌΠΈ, Π½Π°ΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠ΅ integration events, ΡΠ°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Tenant.
Tenant context
Π‘ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ Tenant Lino ΡΠ΅Π½ΡΡΠ°Π»ΠΈΠ·ΡΠ΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ Tenant ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΡΠ΅Π· ITenantContext. ΠΡΠΎΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ Tenant, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΉ ΠΈΠ· subdomain, host ΠΈΠ»ΠΈ slug Π·Π°ΠΏΡΠΎΡΠ°, Π²ΠΊΠ»ΡΡΠ°Ρ ΡΠ²Π΅Π΄Π΅Π½ΠΈΡ Π²ΡΠΎΠ΄Π΅ TenantId ΠΈ slug, ΠΊΠΎΠ³Π΄Π° Tenant Π½Π°ΠΉΠ΄Π΅Π½.
Π Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ
ΠΏΠΎΡΠΎΠΊΠ°Ρ
IUserContext ΡΠΈΡΠ°Π΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈΠ· JWT. ΠΡΠΎΡ JWT ΡΠ°ΠΊΠΆΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ TenantId, Π΄Π»Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π±ΡΠ» Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½. Lino ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅Ρ Tenant ΠΈΠ· IUserContext Ρ Tenant ΠΈΠ· ITenantContext, ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°Ρ Π΄ΠΎΠ²Π΅ΡΠΈΠ΅ Π±ΠΈΠ·Π½Π΅Ρ-ΠΏΡΠ°Π²ΠΈΠ» ΡΠ°ΡΡ
ΠΎΠ΄ΡΡΠΈΠΌΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°ΠΌ.
Π ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ
ΠΈΠ»ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΡΡ
ΠΏΠΎΠ·ΠΆΠ΅ ΡΡΠ½ΠΊΡΠΈΡΡ
Π²ΡΠ΅Π³Π΄Π° ΠΏΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°ΠΉΡΠ΅ ΡΡΠΈ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΠΈ Π²ΠΌΠ΅ΡΡΠΎ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠ³ΠΎ ΡΡΡΠ½ΠΎΠ³ΠΎ ΡΡΠ΅Π½ΠΈΡ claims ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ TenantId Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ handler. ΠΡΠΎ ΡΠΎΡ
ΡΠ°Π½ΡΠ΅Ρ commands, queries, ΡΡΡΠ°Π½ΠΈΡΡ ΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ Π½Π° ΠΎΠ΄Π½ΠΎΠΉ source of truth ΠΈ ΡΠΎΡ
ΡΠ°Π½ΡΠ΅Ρ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ, ΡΠΆΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠ΅ Lino.
Background Jobs, ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ ΡΠΎΠ±ΡΡΠΈΠΉ ΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ ΡΠ°ΠΊΠΆΠ΅ Π½ΡΠΆΠ΄Π°ΡΡΡΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅. Job, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ tenant-scoped ΠΏΡΠΎΠ΄ΡΠΊΡΡ, ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ, Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ²Π½ΠΎ ΠΏΠΎΠ»ΡΡΠ°ΡΡ, ΠΊΠ°ΠΊΠΎΠΉ Tenant ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΡΡΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π½Π΅Ρ Π°ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ HTTP-Π·Π°ΠΏΡΠΎΡΠ°, ΠΈΠ· ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ITenantContext ΠΈ IUserContext ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΠ²Π΅ΡΡΠΈ.
Tenant-scoped ΡΡΡΠ½ΠΎΡΡΠΈ
Tenant-scoped ΡΡΡΠ½ΠΎΡΡΠΈ ΡΠΎΠ΄Π΅ΡΠΆΠ°Ρ identifier Tenant ΠΈ ΡΡΠ°ΡΡΠ²ΡΡΡ Π² query filters. ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΡΠΎΠΌΡ ΠΎΠ±ΡΡΠ½ΡΠΉ ΠΏΠΎΡΠΎΠΊ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΡΡΡΠ½ΡΡ ΠΏΠΎΠΌΠ½ΠΈΡΡ ΠΎ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ TenantId Π²ΠΎ Π²ΡΠ΅Ρ
queries; ΡΡΠ½ΠΊΡΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½Π½ΡΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ ΠΈ ΡΠΈΠ»ΡΡΡΡ, ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Lino.
- ΠΠΊΠ»ΡΡΠ°ΠΉΡΠ΅ Tenant Π² aggregates, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΉ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ.
- ΠΠ°ΡΡΡΠ°ΠΈΠ²Π°ΠΉΡΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΡ Ρ ΡΡΠ΅ΡΠΎΠΌ Tenant ΠΈ ΡΠ°ΡΡΠΎ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅ΠΌΡΡ ΠΏΠΎΠ»Π΅ΠΉ.
- ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅
ITenantContextΠΈIUserContextΠ² commands ΠΈ queries Π²ΠΌΠ΅ΡΡΠΎ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Tenant ΠΊΠ°ΠΊ ΠΈΠ·ΠΎΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ° ΠΏΠΎΠ»Π½ΠΎΠΌΠΎΡΠΈΠΉ. - Π imports ΠΈ jobs ΡΠ²Π½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠΉΡΠ΅, ΠΊΠ°ΠΊΠΎΠΉ Tenant ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΡΡΡ.
Tenant-scoped ΡΡΡΠ½ΠΎΡΡΡ ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ ΠΎΠ΄Π½ΠΎΠΌΡ Tenant. ΠΡΠ»ΠΈ ΡΡΡΠ½ΠΎΡΡΡ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ, Π±ΡΠ΄ΡΠΎ ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌ Tenants, ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΠΉΡΠ΅ ΡΡΠΎ ΠΊΠ°ΠΊ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ: Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΎΠ½Π° global, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½ΡΠΆΠ½Π° ΠΊΠΎΠΏΠΈΡ ΠΏΠΎ Tenant, ΠΈΠ»ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½Π°Ρ ΡΡΡΠ½ΠΎΡΡΡ, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡΠ°Ρ ΡΠ²ΡΠ·Ρ. ΠΡΠΎΠ΄ΡΠΊΡ, ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ ΡΠ°Π·Π½ΡΠΉ ΡΠΌΡΡΠ» Π² ΡΠ°Π·Π½ΡΡ ΠΌΠΎΠ΄ΡΠ»ΡΡ ; Π² ΡΠ°ΠΊΠΈΡ ΡΠ»ΡΡΠ°ΡΡ shadow entity Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΏΠΎΠ»ΡΠΌΠΈ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½Π΅Π΅, ΡΠ΅ΠΌ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΡΠ½ΠΎΡΡΠΈ.
Π’Π°ΠΊΠΆΠ΅ ΡΠ°Π·Π»ΠΈΡΠ°ΠΉΡΠ΅ ΡΡΡΠ»ΠΊΡ ΠΈ ownership. ΠΡΠΎΠ΄ΡΠΊΡ Π² catalog ΠΌΠΎΠΆΠ΅Ρ ΡΡΡΠ»Π°ΡΡΡΡ Π½Π° Tenant, Π½ΠΎ ΡΡΠΎ Π½Π΅ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ catalog ΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ lifecycle Tenant. ΠΠΎΠ΄ΡΠ»Ρ tenancy ΠΎΡΡΠ°Π΅ΡΡΡ Π²Π»Π°Π΄Π΅Π»ΡΡΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ, Π°ΠΊΡΠΈΠ²Π°ΡΠΈΠΈ, Π΄ΠΎΠΌΠ΅Π½Π°, branding ΠΈ ΡΠ΅ΠΆΠΈΠΌΠ° ΠΈΠ·ΠΎΠ»ΡΡΠΈΠΈ; catalog Ρ ΡΠ°Π½ΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π°Π½Π½ΡΠ΅, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ Π΄Π»Ρ ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΠΈ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°.
- ΠΠ½Π΄Π΅ΠΊΡΡ: ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΡΠΉΡΠ΅
TenantIdΡ ΠΏΠΎΠ»ΡΠΌΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΌΠΈ Π΄Π»Ρ ΠΏΠΎΠΈΡΠΊΠ°, ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ ΠΈ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΡΡΠΈ ΠΏΠΎ Tenant. - Commands: ΠΏΡΠΈΠΌΠ΅Π½ΡΠΉΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π² ΡΠ΅ΠΊΡΡΠ΅ΠΌ ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½Π½ΠΎΠΌ Tenant, ΠΊΠΎΠ³Π΄Π° ΡΡΡΠ½ΠΎΡΡΡ tenant-scoped.
- Queries: ΡΠ΄Π΅ΡΠΆΠΈΠ²Π°ΠΉΡΠ΅ ΠΏΠ°Π³ΠΈΠ½Π°ΡΠΈΡ, ΡΠΈΠ»ΡΡΡΡ ΠΈ ΡΡΠ΅ΡΡΠΈΠΊΠΈ Π² ΡΠΎΠΌ ΠΆΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅, ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½Π½ΠΎΠΌ Lino.
- Events: Π²ΠΊΠ»ΡΡΠ°ΠΉΡΠ΅ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°, ΡΡΠΎΠ±Ρ consumers ΠΌΠΎΠ³Π»ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡΡ projections, Π½Π΅ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡ ΠΊ producer Π½Π΅Π½Π°Π΄Π»Π΅ΠΆΠ°ΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ.
ΠΠ·ΠΎΠ»ΡΡΠΈΡ Π΄Π°Π½Π½ΡΡ
ΠΠ·ΠΎΠ»ΡΡΠΈΡ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΏΠΎ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ΅, schema ΠΈΠ»ΠΈ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΉ Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ . ΠΡΠ±ΠΎΡ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΡΡΠΎΠΈΠΌΠΎΡΡΠΈ, ΠΎΠ±ΡΠ΅ΠΌΠ°, Π΄ΠΎΠ³ΠΎΠ²ΠΎΡΠ½ΡΡ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ.
| Π‘ΡΡΠ°ΡΠ΅Π³ΠΈΡ | ΠΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π° | ΠΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ |
|---|---|---|
| ΠΠΎΠ»ΠΎΠ½ΠΊΠ° TenantId | ΠΡΠΎΡΠ΅ ΠΈ Π΄Π΅ΡΠ΅Π²Π»Π΅ | Π₯ΠΎΡΠΎΡΠΈΠΉ Π½Π°ΡΠ°Π»ΡΠ½ΡΠΉ Π²ΡΠ±ΠΎΡ Π΄Π»Ρ ΠΌΠ½ΠΎΠ³ΠΈΡ SaaS, Π² ΡΠΎΡΠ΅ΡΠ°Π½ΠΈΠΈ Ρ ΡΠΈΠ»ΡΡΡΠ°ΠΌΠΈ ΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠΎΠΌ Lino. |
| Schema ΠΏΠΎ Tenant | ΠΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½Π°Ρ ΠΈΠ·ΠΎΠ»ΡΡΠΈΡ | ΠΠΎΠ»Π΅Π·Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° Π½ΡΠΆΠ½Ρ Π±ΠΎΠ»Π΅Π΅ Π²ΡΡΠΎΠΊΠΈΠ΅ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ ΠΊ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΡ Π±Π΅Π· ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π° ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ ΠΏΠΎ Tenant. |
| ΠΠ°Π·Π° Π΄Π°Π½Π½ΡΡ ΠΏΠΎ Tenant | Π‘ΠΈΠ»ΡΠ½Π°Ρ ΠΈΠ·ΠΎΠ»ΡΡΠΈΡ | ΠΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ, ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ, ΠΎΠ±ΡΠ΅ΠΌ ΠΈΠ»ΠΈ ΡΠΊΡΠΏΠ»ΡΠ°ΡΠ°ΡΠΈΡ ΠΎΠΏΡΠ°Π²Π΄ΡΠ²Π°ΡΡ Π±ΠΎΠ»Π΅Π΅ Π²ΡΡΠΎΠΊΠΈΠ΅ ΡΡΠΎΠΈΠΌΠΎΡΡΡ ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ. |
ΠΠ»Ρ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π° SaaS Π½Π° ΡΠ°Π½Π½Π΅ΠΉ ΡΡΠ°Π΄ΠΈΠΈ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° ΠΏΠΎ Tenant Ρ global filters ΠΈ ΡΠ΅Π½ΡΡΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠ°Π³ΠΌΠ°ΡΠΈΡΠ½ΠΎΠΉ ΠΎΡΠΏΡΠ°Π²Π½ΠΎΠΉ ΡΠΎΡΠΊΠΎΠΉ. Lino ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ Ρ ΡΡΠΎΠΉ ΠΎΡΠ½ΠΎΠ²ΠΎΠΉ; Π²Π°ΡΠ° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠ΄ΠΈΡΡ, ΡΡΠΎ tenant-scoped aggregates ΡΠΎΠ΄Π΅ΡΠΆΠ°Ρ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ Tenant, Π° Π½ΠΎΠ²ΡΠ΅ queries ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ΅ΠΊΡΡΠΈΠΉ Tenant, ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½Π½ΡΠΉ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌΠΈ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΡΠΌΠΈ.
Π ΠΌΠΎΠ΄ΡΠ»ΡΠ½ΡΡ
ΡΠ΅ΡΠ²ΠΈΡΠ°Ρ
ΠΈΠ·ΠΎΠ»ΡΡΠΈΡ Tenant ΠΈ ΠΈΠ·ΠΎΠ»ΡΡΠΈΡ ΠΌΠΎΠ΄ΡΠ»Ρ β ΡΠ°Π·Π½ΡΠ΅ Π·Π°Π±ΠΎΡΡ. ΠΠΎΠ΄ΡΠ»Ρ Catalog ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ ΡΠ°Π±Π»ΠΈΡΡ ΠΏΡΠΎΠ΄ΡΠΊΡΠΎΠ² Ρ TenantId; ΠΌΠΎΠ΄ΡΠ»Ρ CRM ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² Ρ TenantId; Π° ΠΌΠΎΠ΄ΡΠ»Ρ Tenancy ΠΎΡΡΠ°Π΅ΡΡΡ Π²Π»Π°Π΄Π΅Π»ΡΡΠ΅ΠΌ ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠΉ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ Tenants. ΠΠ°Π»ΠΈΡΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ ΡΠΎΠ³ΠΎ ΠΆΠ΅ identifier Π½Π΅ ΡΠ°Π·ΡΠ΅ΡΠ°Π΅Ρ ΠΏΡΡΠΌΠΎΠΉ Π΄ΠΎΡΡΡΠΏ ΠΌΠ΅ΠΆΠ΄Ρ ΠΌΠΎΠ΄ΡΠ»ΡΠΌΠΈ.
Roles ΠΈ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΏΠΎ Tenant
Π SaaS ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΠΎΠΌ Π² ΠΎΠ΄Π½ΠΎΠΌ Tenant ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠΌ Π² Π΄ΡΡΠ³ΠΎΠΌ. Lino Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΠΎΡΠ½ΠΎΠ²Ρ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ ΡΠΎ ΡΠ²ΡΠ·ΡΡ user-Tenant, Π° ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΎΡΠ΅Π½ΠΈΠ²Π°ΡΡΡΡ Π²Π½ΡΡΡΠΈ Π°ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°, ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½Π½ΠΎΠ³ΠΎ framework.
Π’Π°ΠΊΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΈΠ²Π½ΡΠ΅ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ Π²Π½Π΅ Tenant. ΠΠΊΡΠ°Π½ ΡΠΊΡΠΏΠ»ΡΠ°ΡΠ°ΡΠΈΠΈ ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π΄ΠΎΡΡΡΠΏΠ΅Π½ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅, ΡΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ ΡΡΡΠ°Π½ΠΈΡΡ Π²ΡΠΎΠ΄Π΅ ΠΏΡΠΎΠ΄ΡΠΊΡΠΎΠ² ΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² ΠΌΠΎΠ³ΡΡ ΡΡΠ΅Π±ΠΎΠ²Π°ΡΡ active Tenant. Π’Π°ΠΊΠΎΠ΅ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΡΠ½ΠΎ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΠΊΠΎΠ³Π΄Π° Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΡΠ²Π»ΡΠ΅ΡΡΡ global, Π° ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΎ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ Tenant, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π² ITenantContext, ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π² IUserContext.
- ΠΠΎΠ΄Π΅Π»ΠΈΡΡΠΉΡΠ΅ roles ΠΏΠΎ Tenant, ΠΊΠΎΠ³Π΄Π° ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΠ°Π·Π»ΠΈΡΠ°ΡΡΡΡ ΠΏΠΎ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡΠΌ.
- ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΠ΅ΠΊΡΡΠΈΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ Π² ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°Ρ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ ΡΡΡΠ°Π½ΠΈΡ, commands ΠΈ queries.
- ΠΠ΅ΡΠΆΠΈΡΠ΅ claims ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΡΠΌΠΈ, ΠΏΠΎΠΌΠ΅ΡΠ°Ρ Π² token ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎ, ΡΡΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΡΠ°ΡΡΠ²ΠΎΠ²Π°ΡΡ Π² Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ΅.
- ΠΡΠ·ΡΠ²Π°ΠΉΡΠ΅ ΠΈΠ»ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠΉΡΠ΅ tokens ΠΏΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΡ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠΉ.
| ΠΠΎΠ½ΡΠ΅ΠΊΡΡ | ΠΡΠΈΠΌΠ΅Ρ | ΠΠ°ΠΊ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ |
|---|---|---|
| System | ΠΠ΄ΠΌΠΈΠ½ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ, ΠΏΠ»Π°Π½Ρ, Tenants ΠΈ global Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ. | ΠΡΠΏΠΎΠ»Π½ΡΡΡ Π²Π½Π΅ scope ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ Tenant. |
| Tenant | ΠΡΠΎΠ΄ΡΠΊΡΡ, ΠΊΠ»ΠΈΠ΅Π½ΡΡ, Π·Π°ΠΊΠ°Π·Ρ, ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ ΠΈ roles ΡΡΠΎΠ³ΠΎ Tenant. | ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ΅ΠΊΡΡΠΈΠΉ Tenant, ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½Π½ΡΠΉ Lino. |
| Both | ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ identity ΠΈΠ»ΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ, ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠ΅ ΠΈ Π² ΡΠΈΡΡΠ΅ΠΌΠ΅, ΠΈ Π² Tenant. | Π use case ΡΠ²Π½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ, ΠΊΠ°ΠΊΠΎΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ. |
JWT ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ Tenant
ΠΠΎΠ³Π΄Π° ΡΡΠ½ΠΊΡΠΈΡ Tenant Π°ΠΊΡΠΈΠ²Π½Π°, Lino ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ JWT ΠΊΠ°ΠΊ ΠΈΡΡΠΎΡΠ½ΠΈΠΊ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ. IUserContext ΡΠΈΡΠ°Π΅Ρ claims ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈ TenantId ΠΈΠ· token, Π½Π΅ ΠΏΡΠ΅Π²ΡΠ°ΡΠ°Ρ JWT Π² ΠΊΠΎΠΏΠΈΡ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
.
- ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΠΉΡΠ΅ issuer, audience, ΠΏΠΎΠ΄ΠΏΠΈΡΡ ΠΈ ΡΡΠΎΠΊ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Π½Π°ΡΡΡΠΎΠ΅Π½Π½ΡΠΌΠΈ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ.
- ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ Tenant, ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½Π½ΡΠΉ Lino, Π²ΠΌΠ΅ΡΡΠΎ ΠΏΡΠΈΠ½ΡΡΠΈΡ ΡΡΡΠ½ΠΎΠΉ ΡΠΌΠ΅Π½Ρ, ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΠΎΠΉ ΡΠΎΠ»ΡΠΊΠΎ Π½Π° header, route ΠΈΠ»ΠΈ payload ΡΠΊΡΠ°Π½Π°.
- ΠΠ·Π±Π΅Π³Π°ΠΉΡΠ΅ ΡΠ»ΠΈΡΠΊΠΎΠΌ Π±ΠΎΠ»ΡΡΠΈΡ claims; ΡΠ°Π·Π΄ΡΡΡΠ΅ tokens ΡΡΠ»ΠΎΠΆΠ½ΡΡΡ ΡΠΊΡΠΏΠ»ΡΠ°ΡΠ°ΡΠΈΡ ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅.
- ΠΠ°ΠΏΠΈΡΡΠ²Π°ΠΉΡΠ΅ logs Π΄ΠΎΡΡΡΠΏΠ° Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ, Tenant ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ΅ΠΉ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡΠΎΠΊ ΡΡΠ΅Π±ΡΠ΅Ρ Π°ΡΠ΄ΠΈΡΠ°.
Π ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ
Ρ subdomains, ΡΠ°ΠΊΠΈΡ
ΠΊΠ°ΠΊ acme.dev.localhost ΠΈ globex.dev.localhost, ITenantContext ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ Tenant, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΉ Π΄Π»Ρ Π·Π°ΠΏΡΠΎΡΠ°. IUserContext ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈ Tenant, ΠΏΡΠΈΡΡΡΡΡΠ²ΡΡΡΠΈΠΉ Π² JWT. Lino ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅Ρ ΡΡΠΈ Π΄Π²Π° ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°, ΡΡΠΎΠ±Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ token, Π²ΡΠ΄Π°Π½Π½ΠΎΠ³ΠΎ Π΄Π»Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Tenant, Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ Π΄ΡΡΠ³ΠΎΠ³ΠΎ Tenant.
ΠΠ²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ ΡΠ°ΠΊΠΆΠ΅ ΠΎΡΡΠ°Π΅ΡΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ½ΠΎΠΉ. Π Π°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ ΠΏΡΠΎΠ΄ΡΠΊΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π΅ΠΉΡΡΠ²ΡΠ΅Ρ Π²Π½ΡΡΡΠΈ Tenant, Π³Π΄Π΅ ΠΎΠ½ΠΎ Π±ΡΠ»ΠΎ Π²ΡΠ΄Π°Π½ΠΎ ΠΈ Π΄Π»Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π±ΡΠ» Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½. ΠΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ Π½ΠΎΠ²ΡΡ
ΡΡΠ½ΠΊΡΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΠΆΠ΅ Π΄ΠΎΡΡΡΠΏΠ½ΡΠ΅ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΡ Π²ΠΌΠ΅ΡΡΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΎΠ±Ρ
ΠΎΠ΄Π½ΡΡ
ΠΏΡΡΠ΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ TenantId ΠΈ ΠΈΠ³Π½ΠΎΡΠΈΡΡΡΡ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΏΠΎΡΠΎΠΊ.
