Compare commits
2 Commits
fb9b522e74
...
58f946490c
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
58f946490c | ||
|
|
5cd78854e3 |
@@ -16,4 +16,5 @@ RLS ist auf Datenbankebene in Postgres implementiert und erzwingt Datenisolierun
|
|||||||
|
|
||||||
- **Systembenutzer (`users`) & Rollen-Schutz**:
|
- **Systembenutzer (`users`) & Rollen-Schutz**:
|
||||||
- Authentifizierte Nutzer dürfen nur ihr eigenes Profil lesen.
|
- Authentifizierte Nutzer dürfen nur ihr eigenes Profil lesen.
|
||||||
|
- Admins dürfen alle Benutzer lesen. Zur Vermeidung von unendlichen RLS-Rekursionen auf der Tabelle `users` wird die Admin-Zuweisung über die Security-Definer-Funktion `public.is_admin(user_id)` geprüft, welche RLS auf Datenbank-Ebene umgeht.
|
||||||
- Rollenschutz-Trigger (`check_user_role_escalation`): Jegliche Änderung der Spalte `role` oder Zuweisung der Rolle `'admin'` ist auf API-Ebene für normale Nutzer gesperrt. Updates/Inserts der Rolle werden ausschließlich von der `service_role` (Backend Admin-Client) akzeptiert, um Privilegien-Eskalation zu verhindern.
|
- Rollenschutz-Trigger (`check_user_role_escalation`): Jegliche Änderung der Spalte `role` oder Zuweisung der Rolle `'admin'` ist auf API-Ebene für normale Nutzer gesperrt. Updates/Inserts der Rolle werden ausschließlich von der `service_role` (Backend Admin-Client) akzeptiert, um Privilegien-Eskalation zu verhindern.
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
-- Migration: Fix Users RLS Recursion and Admin Lockout
|
||||||
|
-- Purpose: Implement a security definer function to check admin status, avoiding infinite recursion on public.users.
|
||||||
|
|
||||||
|
-- 1. Create helper function to check admin role bypassing RLS (SECURITY DEFINER)
|
||||||
|
CREATE OR REPLACE FUNCTION public.is_admin(user_id UUID)
|
||||||
|
RETURNS BOOLEAN AS $$
|
||||||
|
BEGIN
|
||||||
|
RETURN EXISTS (
|
||||||
|
SELECT 1 FROM public.users
|
||||||
|
WHERE id = user_id AND role = 'admin'
|
||||||
|
);
|
||||||
|
END;
|
||||||
|
$$ LANGUAGE plpgsql SECURITY DEFINER;
|
||||||
|
|
||||||
|
-- 2. Drop the recursive policy on public.users
|
||||||
|
DROP POLICY IF EXISTS select_all_users_for_admin ON public.users;
|
||||||
|
|
||||||
|
-- 3. Re-create the policy using the non-recursive helper function
|
||||||
|
CREATE POLICY select_all_users_for_admin ON public.users
|
||||||
|
FOR SELECT
|
||||||
|
TO authenticated
|
||||||
|
USING (public.is_admin(auth.uid()));
|
||||||
Reference in New Issue
Block a user