Seguridad: rol de admin en todas las rutas de administración
Dos rutas de admin dejaban a cualquier usuario registrado leer los emails de tus suscriptores y clientes. Si tienes un proyecto en producción, aplícalo aunque no vayas a tocar nada más.
Esta versión cierra un fallo de seguridad del propio boilerplate y arregla los posts del blog con bloques de código. Si tienes un proyecto en producción construido con CREA.MBA, aplícala ya.
Rutas de admin que solo pedían sesión
GET /api/admin/newsletter y GET /api/admin/subscriptions comprobaban que hubiera una sesión,
pero no que el usuario fuera admin. Cualquier usuario registrado en tu app podía leer los emails
de los suscriptores de la newsletter y de tus clientes, con sus compras y suscripciones. Ahora
responden 403.
Además, todo api/admin/** pasa a usar un único criterio de admin, con respuestas coherentes: 401
sin sesión y 403 con sesión sin rol de admin. Las páginas de admin de posts se protegen también en
el servidor, no solo en el navegador. Y hay un test que recorre todas las rutas de admin y falla si
alguna nueva no devuelve 403 a quien no es admin: un endpoint sin proteger ya no pasa bun run test.
Posts con bloques de código
Desde la 2.1.0, cualquier post del blog con un bloque de código respondía con un error 500. El resaltador de código consulta la hora mientras pinta cada línea, y Next 16 con Cache Components no lo permite. El resultado del resaltado ahora se guarda en caché y esos posts vuelven a cargar.
Si ya tienes un proyecto
- Copia
src/lib/auth/roles.tsysrc/lib/auth/admin-guard.tsa tu proyecto. - En
src/app/api/admin/newsletter/route.tsysrc/app/api/admin/subscriptions/route.ts, envuelve elGETconwithAdmin. Si no puedes copiar ficheros, el arreglo mínimo es cambiarif (!session)porif (!session || session.user.role !== 'admin')y devolver 403. - Revisa tus propias rutas de admin:
grep -rn "getSession" src/app/api/admin. - Copia
src/lib/auth/admin-guard.test.tsy pasabun run test. Te dirá si queda alguna ruta de admin sin proteger. - Para los posts con código, añade
'use cache'ycacheLife('max')al principio demarkdownToHtml. rm -rf .next && bun run builden local antes de desplegar.
No hay migraciones ni variables de entorno nuevas. El detalle completo está en el CHANGELOG.md del
repo.