EF Core'da çok kiracılı veri: kiracı yoksa satır da yok
Yazar, SaaS uygulamalarında kiracılar arası veri sızıntısını önlemek için EF Core global query filter ile kiracı izolasyonu desenini anlatıyor. Kiracı bilgisi yoksa sorgular boş dönüyor. Kiracıya özel benzersiz indeksler ve IgnoreQueryFilters() kullanımının sınırlandırılması da ele alınıyor. Çok kiracılı API geliştiren herkes için pratik bir başlangıç noktası.
Kilit noktalar
- Tenant'a ait tüm entity'ler ortak bir TenantId taşımalı ve HasQueryFilter ile filtrelenmeli
- CurrentTenantId Guid? olduğunda null kiracı hiçbir satır eşleştirmez, yani varsayılan davranış kapalıdır
- Benzersiz indeksler (TenantId, Phone) gibi kiracı anahtarını içermeli
- IgnoreQueryFilters() yalnızca oturum açma, kayıt ve platform işlerinde kullanılmalı ve kod incelemesinde kontrol edilmeli
- İki kiracılı entegrasyon testi, eksik filtreyi üretime çıkmadan yakalamanın en değerli yoludur
Çok kiracılı bir SaaS uygulamasında en ciddi hatalardan biri, bir müşterinin başka bir müşterinin verisini görmesidir. Yazar, bu riski sorgu yazan her geliştiriciye bırakmak yerine EF Core'un global query filter özelliğiyle kiracı filtresini veritabanı bağlamına merkezi olarak eklemeyi öneriyor. Tüm kiracıya ait varlıklar ortak bir TenantId taşıyor ve DbContext, geçerli kullanıcının kiracısını alarak her sorguya otomatik filtre uyguluyor.
Kritik detay, kiracı bilgisinin null olması durumunda filtrenin hiçbir satır döndürmemesidir; böylece unutulmuş bir yetkilendirme veya kiracısız arka plan işi tüm verileri değil boş liste döndürür. Kiracıya özel benzersiz indeksler, aynı telefon numarasının farklı işletmelerde tekrar edebilmesini sağlıyor. IgnoreQueryFilters() çağrılarının oturum açma gibi sınırlı yerlerle kısıtlanması ve iki kiracıyla yazılan bir entegrasyon testinin bu hataları yakalaması da önerilen uygulamalar arasında.
Gerçek dünyada kullanımı
- Birden fazla işletmeye hizmet veren bir POS veya randevu SaaS'ı, her sorguda kiracı filtresini otomatik uygulamak için
- Oturum açmadan erişilen veya arka plan işi çalıştıran API'ler, kiracı yokken boş sonuç dönmesi gereken durumlar
- Kiracı başına benzersiz alanlar gereken uygulamalar, örneğin işletme içinde tekil müşteri telefonu
Neden önemli
Kiracı filtresini her sorguda elle yazmak yerine DbContext seviyesinde tanımlamak, veri sızıntısı riskini önemli ölçüde azaltır. Yeni eklenen entity'lerde filtreyi unutmak da test ile yakalanabilir hale gelir.
Benzer haberler
- Odoo'ya lead gönderirken kaybetmemek: ASP.NET Core'da transactional outboxDEV Community: #aspnetcore2 gün önce
- NebulaGraph'a .NET'ten idempotent toplu yükleme: VID ile çoğaltma sorunuDEV Community: #csharp3 gün önce
- TableSchema ile veritabanı yapısı yükseltmeleri: karşılaştır, planla, uygulaDEV Community: #dotnet3 gün önce