- Klick auf den Benutzernamen im Header (Kantinen- und Admin-Bereich) öffnet /konto - Name-Änderung per RLS-Policy mit spaltenscharfem Grant (nur full_name), Rolle bleibt ausschließlich über die Admin-API änderbar - E-Mail-Änderung über supabase.auth.updateUser mit Bestätigungslink; Trigger synchronisiert profiles.email nach Bestätigung - Passwortänderung verlangt zur Verifizierung das aktuelle Passwort (Re-Login-Check) plus Wiederholung des neuen Passworts - Passkey-Verwaltung aus /intern/konto hierher verschoben
37 lines
1.4 KiB
PL/PgSQL
37 lines
1.4 KiB
PL/PgSQL
-- =============================================================
|
||
-- Selbstverwaltung des eigenen Kontos (Name, E-Mail-Abgleich)
|
||
-- =============================================================
|
||
|
||
-- Jeder Benutzer darf seinen eigenen Anzeigenamen ändern. Die Spalte
|
||
-- "role" bleibt geschützt: Rechte werden nicht per RLS eingeschränkt,
|
||
-- sondern per Spalten-Grant – selbst ein manuell gebauter Request mit
|
||
-- {"role": "admin"} im Payload scheitert an fehlenden Rechten auf die
|
||
-- Spalte. Rollenänderungen laufen weiterhin ausschließlich über die
|
||
-- Admin-API mit dem Service-Role-Key.
|
||
revoke update on public.profiles from authenticated;
|
||
grant update (full_name) on public.profiles to authenticated;
|
||
|
||
create policy "profiles_update_own_name"
|
||
on public.profiles for update
|
||
to authenticated
|
||
using (id = (select auth.uid()))
|
||
with check (id = (select auth.uid()));
|
||
|
||
-- Hält profiles.email synchron, sobald eine E-Mail-Änderung in
|
||
-- auth.users bestätigt wurde (supabase.auth.updateUser({ email })).
|
||
create or replace function public.handle_user_email_change()
|
||
returns trigger
|
||
language plpgsql
|
||
security definer
|
||
set search_path = public
|
||
as $$
|
||
begin
|
||
update public.profiles set email = new.email where id = new.id;
|
||
return new;
|
||
end;
|
||
$$;
|
||
|
||
create trigger on_auth_user_email_updated
|
||
after update of email on auth.users
|
||
for each row execute function public.handle_user_email_change();
|