0Pricing
SQL Academy · Ders

Satır Düzeyi Güvenlik Politikaları

Satırları kullanıcı başına otomatik olarak filtreleyin.

Satır Düzeyi Güvenlik Politikaları, CoddyKit'te ücretsiz bir SQL Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, SQL Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. SQL Academy kursu toplamda 4 dersten oluşur.

Satır Düzeyi Güvenliği Nedir

Satır Düzeyi Güvenlik (RLS), belirli bir veritabanı kullanıcısının veya rolünün bir tablonun hangi satırlarını görebileceğini ya da değiştirebileceğini denetlemenizi sağlayan bir PostgreSQL özelliğidir. Her sorguda satırları süzmek yerine bir politikayı bir kez tanımlarsınız ve PostgreSQL bunu her SELECT, INSERT, UPDATE ve DELETE işleminde otomatik olarak uygular.

Bunu, belirli bir sorguya değil tablonun kendisine eklenmiş görünmez bir WHERE yan tümcesi gibi düşünebilirsiniz.

Bir Tabloda RLS'yi Etkinleştirme

RLS varsayılan olarak devre dışıdır. Her tablo için ALTER TABLE ... ENABLE ROW LEVEL SECURITY kullanarak bunu açıkça etkinleştirmeniz gerekir. Etkinleştirildikten sonra tablo sahibi olmayan tüm roller, en az bir politika oluşturulana kadar sıfır satır görür.

-- Create a sample table
CREATE TABLE orders (
  id        SERIAL PRIMARY KEY,
  owner     TEXT NOT NULL,
  amount    NUMERIC(10,2)
);

-- Enable RLS
ALTER TABLE orders ENABLE ROW LEVEL SECURITY;

İlk Politikanızı Oluşturma

Bir politika CREATE POLICY ile oluşturulur. Politikaya bir ad verir, tabloyu belirtir ve bir USING ifadesi sağlarsınız. USING yan tümcesi, her satır için değerlendirilen bir mantıksal ifadedir; yalnızca ifade sonucunun TRUE olduğu satırlar kullanıcı tarafından görülebilir.

-- Allow each user to see only their own orders
CREATE POLICY orders_owner_policy
  ON orders
  FOR SELECT
  USING (owner = current_user);

USING ile WITH CHECK Yan Tümceleri

Politikaların farklı amaçlara hizmet eden iki filtre yan tümcesi vardır:

  • USING — okuma işlemlerinde satırları filtreler (SELECT, UPDATE, DELETE). Bir satır yalnızca USING TRUE döndürürse görünür.
  • WITH CHECK — yazma işlemlerindeki satırları doğrular (INSERT, UPDATE). Bir yazma işlemine yalnızca WITH CHECK TRUE döndürürse izin verilir. Atlanırsa, yazma denetimleri için USING yeniden kullanılır.
-- Allow users to select and insert only their own rows
CREATE POLICY orders_isolation
  ON orders
  FOR ALL
  USING       (owner = current_user)
  WITH CHECK  (owner = current_user);

Politika Kapsamı: FOR SELECT, INSERT, UPDATE, DELETE

Tek bir politika tüm komutları (FOR ALL) veya belirli bir komutu kapsayabilir. Politikaları komutlara göre ayırmak size ince ayrıntılı denetim sağlar — örneğin her kullanıcının tüm satırları okumasına, ancak yalnızca kendi satırlarını değiştirmesine izin verebilirsiniz.

-- Everyone can read all orders
CREATE POLICY read_all_orders
  ON orders
  FOR SELECT
  USING (true);

-- But each user can only update their own orders
CREATE POLICY update_own_orders
  ON orders
  FOR UPDATE
  USING       (owner = current_user)
  WITH CHECK  (owner = current_user);

Oturum Kullanıcısı ve current_user Kullanımı

PostgreSQL, bir politika ifadesi içinde etkin kullanıcıyı belirlemek için yerleşik işlevler sağlar:

  • current_user — ayrıcalıkları o anda etkin olan rol (SET ROLE sonrasında değişebilir).
  • session_user — bağlantıyı açan rol (oturum boyunca hiç değişmez).

Çoğu RLS politikası, rol değiştirme sonrasındaki etkin rolü yansıttığı için current_user kullanır.

-- Inspect the current identity inside a query
SELECT current_user, session_user;

RLS'yi Belirli Rollere Uygulama

Varsayılan olarak bir politika PUBLIC'e (tüm rollere) uygulanır. TO yan tümcesini kullanarak politikayı belirli bir rolle sınırlandırabilirsiniz. Bu, normal kullanıcılar için bir politika, yönetici rolü içinse farklı bir politika kullanmak istediğinizde yararlıdır.

-- Policy only for the 'app_user' role
CREATE POLICY app_user_policy
  ON orders
  FOR SELECT
  TO app_user
  USING (owner = current_user);

-- Separate permissive policy for 'admin' role
CREATE POLICY admin_full_access
  ON orders
  FOR ALL
  TO admin
  USING (true)
  WITH CHECK (true);

İzin Verici ve Kısıtlayıcı Politikalar

Aynı tablo üzerindeki birden çok politika iki şekilde etkileşime girebilir:

  • PERMISSIVE (varsayılan) — tüm izin verici politikalar OR işlemiyle birleştirilir. Herhangi bir izin verici politika izin veriyorsa bir satışa erişilebilir.
  • RESTRICTIVE — kısıtlayıcı politikalar, izin verici sonuçla AND işlemiyle birleştirilir. Bir satıra yalnızca kısıtlayıcı politikadan geçerse ve en az bir izin verici politika izin verirse erişilebilir.
-- Restrictive policy: block access to archived orders for everyone
CREATE POLICY no_archived_rows
  ON orders
  AS RESTRICTIVE
  FOR SELECT
  USING (amount > 0);

RLS'yi Atlama: BYPASSRLS ve Tablo Sahipleri

Tablo sahibi ve süper kullanıcılar varsayılan olarak RLS'yi atlar ve her zaman tüm satırları görür. Bir rolün süper kullanıcı olmadan sınırsız erişime ihtiyacı varsa role BYPASSRLS özniteliği verebilirsiniz. Bunun tersine, FORCE ROW LEVEL SECURITY kullanarak sahibin RLS kurallarına uymasını zorunlu kılabilirsiniz.

-- Force the table owner to also obey RLS policies
ALTER TABLE orders FORCE ROW LEVEL SECURITY;

-- Grant BYPASSRLS to a trusted service account
ALTER ROLE service_account BYPASSRLS;

Politikaları Değiştirme ve Kaldırma

Mevcut bir politikayı ALTER POLICY ile güncelleyebilir veya DROP POLICY ile tamamen kaldırabilirsiniz. RLS hâlâ etkin durumdayken tüm politikaları kaldırmak, sahibi olmayan rollerin hiçbir satıra erişememesi anlamına gelir. RLS'yi tamamen kaldırmak için ALTER TABLE ile devre dışı bırakın.

-- Rename a policy
ALTER POLICY orders_owner_policy ON orders
  RENAME TO user_isolation_policy;

-- Update the USING expression
ALTER POLICY user_isolation_policy ON orders
  USING (owner = current_user AND amount >= 0);

-- Remove a policy
DROP POLICY admin_full_access ON orders;

-- Disable RLS entirely on the table
ALTER TABLE orders DISABLE ROW LEVEL SECURITY;

Gerçek Dünya Deseni: Çok Kiracılı Veri Yalıtımı

Çok kiracılı hizmet olarak yazılım uygulamalarında yaygın bir RLS deseni, her tabloda bir kiracı kimliği sütunu bulundurur ve bağlantı sırasında kiracı tanımlayıcısını aktarmak için oturum düzeyinde bir değişken (set_config) kullanır. Politika daha sonra her satırın kiracı kimliğini bu ayarla karşılaştırır.

-- Table with tenant isolation column
CREATE TABLE documents (
  id         SERIAL PRIMARY KEY,
  tenant_id  TEXT NOT NULL,
  title      TEXT
);

ALTER TABLE documents ENABLE ROW LEVEL SECURITY;

-- Policy reads the tenant from a session variable
CREATE POLICY tenant_isolation
  ON documents
  FOR ALL
  USING       (tenant_id = current_setting('app.tenant_id'))
  WITH CHECK  (tenant_id = current_setting('app.tenant_id'));

-- Application sets the variable before running queries
SELECT set_config('app.tenant_id', 'tenant_42', true);

-- Now only tenant_42 documents are visible
SELECT * FROM documents;

Bilgi Kontrolü

PostgreSQL'deki satır düzeyinde güvenlik politikaları hakkındaki anlayışınızı sınayın.

Ders Özeti

Bu derste, satır düzeyinde güvenliğin veritabanı düzeyinde otomatik ve politika temelli satır filtreleme olanağı sağladığını öğrendiniz:

  • Bir tabloda ALTER TABLE ... ENABLE ROW LEVEL SECURITY ile RLS'yi etkinleştirin.
  • Okunabilir satırları filtrelemek için USING yan tümcesiyle, yazılan satırları doğrulamak için WITH CHECK yan tümcesiyle CREATE POLICY kullanın.
  • Politikaları belirli komutlarla (SELECT, INSERT, UPDATE, DELETE, ALL) ve TO yan tümcesini kullanarak belirli rollerle sınırlandırın.
  • Katmanlı erişim denetimi için PERMISSIVE (OR mantığı) ve RESTRICTIVE (AND mantığı) politikalarını birleştirin.
  • Tablo sahipleri ve süper kullanıcılar varsayılan olarak RLS'yi atlar; bunu geçersiz kılmak için FORCE ROW LEVEL SECURITY kullanın.
  • current_setting() kullanan çok kiracılı desen, RLS'nin güçlü bir gerçek dünya uygulamasıdır.

RLS, her uygulama sorgusuna WHERE yan tümcelerini dağıtmadan veri yalıtımını temiz ve tutarlı biçimde zorunlu kılmanın standart yoludur.

Sıkça Sorulan Sorular

“Satır Düzeyi Güvenlik Politikaları” dersi ücretsiz mi?

Evet — “Satır Düzeyi Güvenlik Politikaları” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve SQL Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. SQL Academy kursu toplamda 4 dersten oluşur.

“Satır Düzeyi Güvenlik Politikaları” dersinde ne öğreneceğim?

Satırları kullanıcı başına otomatik olarak filtreleyin. SQL Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

SQL Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te SQL Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“Satır Düzeyi Güvenlik Politikaları” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu SQL Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her SQL Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Roller ve Ayrıcalıklar
  2. Satır Düzeyi Güvenlik Politikaları
  3. Sütun Düzeyi İzinler
  4. Erişimi Denetleme
← SQL Academy Sayfasına Dön