Row Level Security

Veri koruması için Row Level Security'yi (RLS) anlama ve uygulama.

Not: Bu içerik, tanıtım amacıyla hazırlanmış örnek/yer tutucu bir içeriktir.

Row Level Security (RLS), kullanıcıların veritabanı tablolarında hangi satırlara erişebileceğini denetleyen, PostgreSQL'e yerleşik bir yetkilendirme sistemidir.

Neden RLS?

RLS çeşitli avantajlar sunar:

  • Veritabanı düzeyinde güvenlik - Uygulama kodunda hata olsa bile koruma sağlar
  • Otomatik uygulama - Manuel yetkilendirme kontrollerine gerek kalmaz
  • Çok kiracılı izolasyon - Kullanıcıların yalnızca kendi verilerini görmesini sağlar
  • Performans - Veritabanı düzeyinde optimize edilmiştir

RLS'yi Etkinleştirme

Tüm tablolarda RLS etkin olmalıdır:

ALTER TABLE your_table ENABLE ROW LEVEL SECURITY;

Yaygın Politika Kalıpları

Kişisel Hesap Erişimi

CREATE POLICY "Users can access their personal account data"
  ON your_table FOR ALL
  USING (account_id = auth.uid());

Ekip Hesabı Erişimi

CREATE POLICY "Users can access their team account data"
  ON your_table FOR ALL
  USING (
    account_id IN (
      SELECT account_id FROM accounts_memberships
      WHERE user_id = auth.uid()
    )
  );

Okuma ve Yazma İzinleri

-- Tüm üyeler okuyabilir
CREATE POLICY "Team members can view data"
  ON your_table FOR SELECT
  USING (account_id IN (SELECT get_user_accounts(auth.uid())));

-- Yalnızca sahipler değiştirebilir
CREATE POLICY "Only owners can modify data"
  ON your_table FOR UPDATE
  USING (
    account_id IN (
      SELECT account_id FROM accounts_memberships
      WHERE user_id = auth.uid() AND role = 'owner'
    )
  );

RLS Politikalarını Test Etme

RLS politikalarınızın doğru çalıştığından emin olmak için onları her zaman test edin:

-- Belirli bir kullanıcı olarak test et
SET request.jwt.claims.sub = 'user-uuid-here';

-- Veri seçmeyi dene
SELECT * FROM your_table;

-- Sıfırla
RESET request.jwt.claims.sub;

Yönetici Atlatması

Service role anahtarları RLS'yi atlar. Bunları son derece dikkatli kullanın ve admin istemcisini kullanırken her zaman manuel yetkilendirme kontrolleri uygulayın.