32 lines
1.4 KiB
SQL
32 lines
1.4 KiB
SQL
-- Migration: Erstelle admin_audit_logs Tabelle für Login-Sicherheit
|
|
-- Datum: 2026-04-17
|
|
-- Zweck: Protokollierung aller Admin-Login-Versuche (erfolgreich und fehlgeschlagen)
|
|
|
|
-- Tabelle erstellen
|
|
CREATE TABLE IF NOT EXISTS admin_audit_logs (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
email text NOT NULL,
|
|
ip_addr text NOT NULL,
|
|
user_agent text NOT NULL,
|
|
success boolean NOT NULL,
|
|
reason text, -- z.B. "invalid_password", "user_not_found_or_inactive", "missing_credentials"
|
|
timestamp timestamptz DEFAULT now()
|
|
);
|
|
|
|
-- Indexes für Performance
|
|
CREATE INDEX IF NOT EXISTS idx_audit_logs_email ON admin_audit_logs(email);
|
|
CREATE INDEX IF NOT EXISTS idx_audit_logs_ip ON admin_audit_logs(ip_addr);
|
|
CREATE INDEX IF NOT EXISTS idx_audit_logs_success ON admin_audit_logs(success);
|
|
CREATE INDEX IF NOT EXISTS idx_audit_logs_timestamp ON admin_audit_logs(timestamp DESC);
|
|
CREATE INDEX IF NOT EXISTS idx_audit_logs_email_timestamp ON admin_audit_logs(email, timestamp DESC);
|
|
|
|
-- RLS (Row Level Security) - nur Admins können Logs anschauen
|
|
ALTER TABLE admin_audit_logs ENABLE ROW LEVEL SECURITY;
|
|
|
|
CREATE POLICY "Admin können ihre eigenen Logs sehen" ON admin_audit_logs
|
|
FOR SELECT
|
|
USING (true); -- TODO: Später auf Admin-Session prüfen
|
|
|
|
-- Automatische Cleanup: Alte Logs nach 90 Tagen löschen (optional)
|
|
-- Dies kann auch manuell als Cron-Job eingerichtet werden via supabase/functions
|