Bu sistem, rol yönetimini güvenli hale getirmek için tek kaynak gerçeği (Single Source of Truth) prensibini kullanır.
- Ana Kaynak:
userstablosu (veritabanı) - Cache: Auth metadata (JWT token)
- Rol bilgisi sadece veritabanında tutulur, auth metadata sadece cache olarak kullanılır
- Sadece
adminveownerrolündeki kullanıcılar rol değişikliği yapabilir - Tüm rol değişiklikleri loglanır
- Yetkisiz işlemler engellenir
- Veritabanı seviyesinde güvenlik
- Kullanıcılar sadece yetkili oldukları verilere erişebilir
- SQL injection ve yetkisiz erişim koruması
- Tüm API key'ler environment variable'lardan alınır
- Hardcoded key'ler tamamen kaldırıldı
- Service role key'i sadece server-side işlemlerde kullanılır
- Public key'ler
NEXT_PUBLIC_prefix'i ile browser'da erişilebilir - Private key'ler sadece server-side environment'da kullanılabilir
owner > admin > manager > waiter > pending
- Owner: Tam yetki
- Admin: Kullanıcı yönetimi, sistem ayarları
- Manager: Menü yönetimi, raporlar
- Waiter: Sipariş alma, masa yönetimi
- Pending: Onay bekleyen kullanıcılar
# env.example dosyasını .env.local olarak kopyala
cp env.example .env.local
# Gerçek Supabase değerlerini .env.local dosyasına ekle:
NEXT_PUBLIC_SUPABASE_URL=https://your-project-ref.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
SUPABASE_SERVICE_ROLE_KEY=your-service-role-keynode scripts/migrate-roles.js-- Supabase Dashboard > SQL Editor'da çalıştır
-- supabase/migrations/20241220_add_rls_policies.sql dosyasındaki komutlarıimport { getUserRole, updateUserRole, hasRole } from '../lib/auth-utils';
// Rol kontrolü
const userRole = await getUserRole(userId);
// Yetki kontrolü
const canManageUsers = await hasRole(userId, ['admin', 'owner']);
// Rol güncelleme (sadece admin/owner)
const result = await updateUserRole(userId, newRole, adminUserId);- Tek kaynak gerçeği (users tablosu)
- Admin yetki kontrolü
- Güvenli rol güncelleme fonksiyonları
- RLS politikaları
- Migration script'i
- Auth metadata cache sistemi
- Environment variable güvenliği
- Hardcoded key'lerin kaldırılması
- Audit trail sistemi
- Rol değişiklik logları
- Otomatik backup sistemi
- Güvenlik testleri
// Güvenli rol kontrolü
const userRole = await getUserRole(userId);
if (userRole === 'pending') {
// Kullanıcı henüz onaylanmamış
return;
}// Belirli yetkileri kontrol et
const canAccessDashboard = await hasRole(userId, ['owner', 'admin']);
const canManageMenu = await hasRole(userId, ['owner', 'admin', 'manager']);// Sadece admin/owner yapabilir
const result = await updateUserRole(userId, 'manager', adminUserId);
if (result.success) {
console.log('Rol güncellendi');
} else {
console.error('Hata:', result.error);
}- JWT Token Manipülasyonu: Client-side'da rol değiştirilemez
- Admin Kontrolü: Sadece yetkili kullanıcılar rol değiştirebilir
- Veritabanı Güvenliği: RLS ile korunur
- Audit Trail: Tüm değişiklikler izlenebilir
- Fallback Mekanizması: Auth metadata cache olarak kullanılır
- Migration script'ini çalıştırın
- Auth metadata'yı kontrol edin
- Users tablosundaki rolü kontrol edin
- Kullanıcının rolünü kontrol edin
- RLS politikalarını kontrol edin
- Admin yetkisini doğrulayın
- Service role key'i kontrol edin
- Supabase bağlantısını test edin
- Kullanıcı verilerini kontrol edin
- Audit Trail: Tüm rol değişikliklerini loglama
- Otomatik Backup: Rol verilerinin otomatik yedeklenmesi
- Güvenlik Testleri: Otomatik güvenlik testleri
- Bildirim Sistemi: Rol değişikliklerinde bildirim
- Geçmiş Görüntüleme: Rol değişiklik geçmişi
Güvenlik sorunları için:
- Supabase Dashboard > Logs
- Console logları
- Network tab'ı
- RLS policy testleri