Start here

Arrows to move, enter to open, escape to close.

Ship/Now

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.com

Une 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.