Classes Tablosu RLS Politikaları#
Classes tablosu için Row Level Security politikalarının detaylı açıklamaları.
RLS Durumu#
ALTER TABLE "public"."classes" ENABLE ROW LEVEL SECURITY;Aktif Politikalar#
1. users_can_view_relevant_classes#
Kullanıcılar ilgili oldukları sınıfları görüntüleyebilir (öğrenciler katıldıkları, öğretmenler oluşturdukları, admin/editor tüm sınıfları).
CREATE POLICY "users_can_view_relevant_classes"
ON "public"."classes"
FOR SELECT
TO "authenticated"
USING (
-- Öğrenciler: Katıldıkları sınıflar
(EXISTS (
SELECT 1
FROM ("public"."class_members" "cm"
JOIN "public"."users" "u" ON (("cm"."student_id" = "u"."id")))
WHERE (("cm"."class_id" = "classes"."id")
AND ("u"."auth_user_id" = "auth"."uid"())
AND ("u"."role_id" = 1)
AND ("cm"."deleted_at" IS NULL))
))
OR
-- Öğretmenler: Oluşturdukları sınıflar
(EXISTS (
SELECT 1
FROM "public"."users" "u"
WHERE (("u"."id" = "classes"."teacher_id")
AND ("u"."auth_user_id" = "auth"."uid"())
AND ("u"."role_id" = 2))
))
OR
-- Admin/Editor: Tüm sınıflar
(EXISTS (
SELECT 1
FROM "public"."users" "u"
WHERE (("u"."auth_user_id" = "auth"."uid"())
AND ("u"."role_id" = ANY (ARRAY[3, 4])))
))
);Amaç: Rol tabanlı sınıf görüntüleme yetkisi sağlar.
Koşullar:
- Öğrenciler (role_id=1): Sadece katıldıkları aktif sınıfları görür
- Öğretmenler (role_id=2): Sadece kendi oluşturdukları sınıfları görür
- Admin (role_id=3) ve Editor (role_id=4): Tüm sınıfları görür
2. teachers_admins_editors_can_create_classes#
Öğretmenler, adminler ve editorler yeni sınıf oluşturabilir.
CREATE POLICY "teachers_admins_editors_can_create_classes"
ON "public"."classes"
FOR INSERT
TO "authenticated"
WITH CHECK (
EXISTS (
SELECT 1
FROM "public"."users"
WHERE (("users"."auth_user_id" = "auth"."uid"())
AND ("users"."id" = "classes"."teacher_id")
AND ("users"."role_id" = ANY (ARRAY[2, 3, 4])))
)
);Amaç: Sadece yetkili rollerin sınıf oluşturmasını sağlar.
Koşullar:
- Kullanıcı giriş yapmış olmalı (authenticated)
- Kullanıcının rolü teacher (2), admin (3) veya editor (4) olmalı
- Oluşturulan sınıfın teacher_id’si kullanıcının kendi id’si olmalı
3. owners_can_update_classes#
Sınıf sahibi öğretmenler veya admin/editor’ler sınıfları güncelleyebilir.
CREATE POLICY "owners_can_update_classes"
ON "public"."classes"
FOR UPDATE
TO "authenticated"
USING (
-- Öğretmen: Kendi sınıfı
(("teacher_id" IN (
SELECT "users"."id"
FROM "public"."users"
WHERE (("users"."auth_user_id" = "auth"."uid"())
AND ("users"."role_id" = 2))
)))
OR
-- Admin/Editor: Tüm sınıflar
(EXISTS (
SELECT 1
FROM "public"."users"
WHERE (("users"."auth_user_id" = "auth"."uid"())
AND ("users"."role_id" = ANY (ARRAY[3, 4])))
))
);Amaç: Sınıf sahibi veya admin/editor’lerin sınıf bilgilerini güncellemesini sağlar.
Koşullar:
- Öğretmen ise sadece kendi sınıflarını güncelleyebilir
- Admin/Editor tüm sınıfları güncelleyebilir
4. owners_can_delete_classes#
Sınıf sahibi öğretmenler veya admin/editor’ler sınıfları silebilir.
CREATE POLICY "owners_can_delete_classes"
ON "public"."classes"
FOR DELETE
TO "authenticated"
USING (
-- Öğretmen: Kendi sınıfı
(("teacher_id" IN (
SELECT "users"."id"
FROM "public"."users"
WHERE (("users"."auth_user_id" = "auth"."uid"())
AND ("users"."role_id" = 2))
)))
OR
-- Admin/Editor: Tüm sınıflar
(EXISTS (
SELECT 1
FROM "public"."users"
WHERE (("users"."auth_user_id" = "auth"."uid"())
AND ("users"."role_id" = ANY (ARRAY[3, 4])))
))
);Amaç: Sınıf sahibi veya admin/editor’lerin sınıfları silmesini sağlar.
Koşullar:
- Öğretmen ise sadece kendi sınıflarını silebilir
- Admin/Editor tüm sınıfları silebilir
Admins can view all classes#
-- İçeriği buraya ekleyinizTest Senaryoları#
Başarılı Senaryo - Sınıf Oluşturma#
-- Öğretmen kendi sınıfını oluşturur
INSERT INTO classes (name, teacher_id, school_id)
VALUES ('10-A Matematik', current_teacher_id, current_school_id);
-- BaşarılıBaşarısız Senaryo - Öğrenci Sınıf Oluşturamaz#
-- Öğrenci sınıf oluşturmaya çalışır
INSERT INTO classes (name, teacher_id, school_id)
VALUES ('10-A Matematik', some_teacher_id, current_school_id);
-- RLS politikası tarafından reddedilirMulti-Tenant Kontrol#
RLS politikaları okul bazlı (multi-tenant) veri izolasyonu da sağlamalıdır:
-- school_id kontrolü eklenmeli
AND school_id = (
SELECT school_id FROM users WHERE auth_user_id = auth.uid()
)İlgili Tablolar#
public.classespublic.userspublic.rolespublic.schoolspublic.class_members
Notlar#
- Öğretmen kendi sınıflarını yönetir
- Multi-tenant okul yapısı desteklenir
- Rol bazlı erişim kontrolü
- Öğrenci görüntüleme politikası eklenmeli