Ne işe yarar (iş diliyle)
Aynı sistemi birden çok kuruma satarken en büyük risk, bir müşterinin ötekinin verisini görmesidir. Bu yetenek o sınırı uygulama koduna değil veritabanına koyar: bir geliştirici hata yapıp süzgeci unutsa bile, veritabanı yanlış müşterinin satırını döndürmez. Yani izolasyon “herkes dikkatli yazsın” temennisine değil, kırılması imkânsız bir mekanizmaya dayanır. B2B SaaS’ta müşteriye verilebilecek en güçlü veri-ayrımı sözüdür.
Hangi müşteri/projelerde işe yarar
- Aynı yazılımı birden çok kuruma/markaya satan her SaaS (portal, dashboard, ERP).
- Bayi/şube/franchise gibi birbirini görmemesi gereken hesap gruplarının olduğu ürünler.
- Veri sızıntısının ciddi sonucu olan (kurumsal, finansal, kişisel veri) her çok-kiracılı sistem.
Nasıl çalışır (kısa, sade)
Her müşteriye bir kimlik (site id) verilir ve bu kimlik, veritabanı bağlantısının kendisine gömülür — her istekte ayrıca “şu müşteriye bak” demek gerekmez, bağlantı zaten o müşterinindir. Veritabanındaki her tabloda bir kural (RLS politikası) vardır: “yalnız aktif müşterinin satırlarını göster”. Kapsam ayarlanmamışsa hiçbir satır dönmez (fail-closed) — güvenli varsayılan budur. Uygulama, veritabanına yetkisiz bir rolle bağlanır ki bu kurallar gerçekten işlesin.
Olgunluk
canlida-kanitlanmis — Mod ERP’de iki müşteriyle (Nuh Çimento, Akçansa) sahada. Staging’de ölçüldü: kapsamsız sorgu 0 satır dönüyor, çapraz yazma denemesi veritabanı tarafından reddediliyor. Uygulama katmanı süzgeci + RLS iki kat birlikte çalışıyor.
Teknik (geliştiriciler için)
mod-erp · Postgres RLS politikaları (app.site_id GUC), bağlantı dizesine options=-c app.site_id=<uuid>
gömülü — “SET’i unutmak” imkânsız çünkü ayarlayan kod satırı yok. İki rol: moderp (superuser, göç +
pg_dump yedeği için — RLS’e tabi değil) ve moderp_app (NOLOGIN, NOSUPERUSER, NOBYPASSRLS — uygulama
çalışma anı). ⚠️ RLS’i FİİLEN açan şey yetkisiz rol; superuser bağlanınca RLS baypas olur (staging’de
bilfiil ölçüldü). Kapsam AsyncLocalStorage ile istek başına taşınır (enterWith — run() değil,
promise ertelemesinde kaybolmasın). PrismaService bir Proxy: çağrıyı o anki kapsamın havuzuna
yönlendirir, servisler değişmez. Sistem bağlamı ('*') sayılı ve gerekçeli yerlerde (cron, kimlik
doğrulama). Sınır: geliştirici hatasına karşı sert duvar, SQL enjeksiyonuna karşı değil (moderp hâlâ
RESET ROLE diyebilir).