v0.1 — Admin RLS Policies

Branch: develop (commit diretto) Data: 24/03/2026 Tipo: fix (sicurezza, RLS, admin panel)


Contesto

Le pagine admin /admin/users e /admin/events non mostravano dati perché le RLS policy esistenti sulla tabella profiles ed events restringevano la visibilità alla sola riga dell’utente corrente (auth.uid() = id). Un admin loggato vedeva solo se stesso.


Problema tecnico

Il frontend usa il browser client Supabase (chiave anon + JWT dell’utente). Per le query admin, il token JWT contiene il user_id ma Supabase RLS non ha una funzione built-in auth.role() che legge dalla tabella profiles — occorre una subquery esplicita.

Le policy aggiunte sono PERMISSIVE e vengono sommate con OR alle policy esistenti:

  • Utenti normali: la policy preesistente auth.uid() = id li limita alla propria riga ✓
  • Admin: la nuova policy consente SELECT su tutto ✓

Migration 20260324000004_admin_rls_policies.sql

Tabella profiles

-- Lettura: admin vede tutti i profili
CREATE POLICY "admin_read_all_profiles"
  ON public.profiles FOR SELECT
  USING (
    EXISTS (
      SELECT 1 FROM public.profiles p
      WHERE p.id = auth.uid()
        AND p.role IN ('admin', 'super_admin')
    )
  );
 
-- Scrittura: admin può aggiornare qualsiasi profilo (ruolo/stato)
CREATE POLICY "admin_update_any_profile"
  ON public.profiles FOR UPDATE
  USING (
    EXISTS (
      SELECT 1 FROM public.profiles p
      WHERE p.id = auth.uid()
        AND p.role IN ('admin', 'super_admin')
    )
  )
  WITH CHECK (true);

Tabella events

-- Lettura: admin vede tutti gli eventi
CREATE POLICY "admin_read_all_events"
  ON public.events FOR SELECT
  USING ( ... role IN ('admin', 'super_admin') ... );
 
-- Modifica: admin può pubblicare/cancellare/bozza qualsiasi evento
CREATE POLICY "admin_update_any_event"
  ON public.events FOR UPDATE ...;
 
-- Cancellazione: admin può eliminare qualsiasi evento
CREATE POLICY "admin_delete_any_event"
  ON public.events FOR DELETE ...;

Sidebar: Post rimosso

La voce Post è stata rimossa da AdminSidebar.tsx in quanto la feature non è ancora implementata. Verrà reintrodotta in una release futura.


File modificati / creati

  • supabase/migrations/20260324000004_admin_rls_policies.sql (nuovo)
  • components/dashboard/AdminSidebar.tsx