Ce qui est branché · 2 min
Administration
Une vue en lecture seule de ce qui se passe, protégée par une liste d'adresses plutôt qu'une colonne que n'importe qui peut écrire.
/admin affiche les commandes, les utilisateurs et le chiffre d'affaires. Elle
existe pour répondre à « est-ce que ce paiement est passé » sans ouvrir le
tableau de bord Stripe, et elle s'arrête délibérément là.
Qui entre
ADMIN_EMAILS=vous@example.com,associe@example.comUne variable d'environnement, pas une colonne is_admin. Le raisonnement est
court : une colonne sur une table qu'un utilisateur peut mettre à jour est une
colonne qu'un utilisateur peut se donner. Même là où la policy l'interdit
aujourd'hui, il suffit d'une policy update négligente pour en faire une
escalade de privilèges, et cela ressemblerait à une ligne de code ordinaire en
relecture.
Changer la liste des administrateurs demande un déploiement. C'est exactement la bonne dose de friction pour la liste des gens qui peuvent voir les données de tout le monde.
const user = await requireUser();
const admins = (process.env.ADMIN_EMAILS ?? "").split(",").map((s) => s.trim());
if (!admins.includes(user.email)) notFound();notFound() plutôt qu'une redirection, pour que la page ne confirme pas son
existence à quelqu'un qui sonde.
Pourquoi en lecture seule
Un panneau d'administration capable de modifier des lignes a besoin d'une piste d'audit, d'une confirmation et d'une annulation, sinon c'est un pistolet braqué sur votre pied avec une belle police. Les remboursements ont leur place dans Stripe, où ils déclenchent déjà votre webhook. Les corrections de données ont leur place dans l'éditeur SQL Supabase, où elles sont journalisées.
Si vous ajoutez tout de même une action d'écriture, mettez-la derrière une server action qui revérifie la liste. Ne vous fiez pas au fait que la page se soit affichée.
L'étendre
La page est un seul Server Component qui fait une poignée de requêtes avec
supabaseAdmin(). Ajoutez une requête, ajoutez un tableau, restez ennuyeux.
C'est le seul écran où un graphique vaut moins qu'une liste des vingt dernières
lignes.
Une erreur ou un manque sur cette page ? Dites-le-nous.