Multi-Tenant İzolasyon
Genel İlke
Her katmanda kiracı (tenant) izolasyonu zorunludur. Bir kiracının verileri başka kiracı tarafından erişilemez.
API Katmanı
Her endpoint tenant_id dependency alır:
@router.get("/devices")
async def list_devices(
user: CurrentUser = require_permissions([Permission.READ_DEVICE])
):
# user.tenant_id otomatik olarak JWT'den çıkarılır
devices = await db.execute(
select(Device).where(Device.tenant_id == user.tenant_id)
)
Veritabanı Katmanı
35 tablo tenant_id kolonu içerir. Tüm sorgularda filtre zorunludur:
SELECT * FROM devices WHERE tenant_id = :tid AND id = :device_id
MQTT Katmanı
Topic'lerde tenant/{tid}/ prefix'i:
tenant/e7dcb56a-.../gw/235b492f-.../data/device/varkombi-001/realtime
ACL kuralları ile gateway sadece kendi tenant topic'lerine erişebilir.
WebSocket Katmanı
TenantRoom yapısı: Her kiracı ayrı odada, sadece kendi cihazlarının verilerini alır.
Yeni Endpoint Checklist
Yeni endpoint eklerken:
- Router'a
tenant_iddependency ekle (genellikleCurrentUserile otomatik) - Tüm query'lerde
WHERE tenant_id = :tidfiltresi uygula - MQTT topic'te
tenant/{tid}/prefix'i kullan - WebSocket broadcast'te tenant room kontrolü yap