Files
InsanityLab-web/src/pages/admin/login.astro
T
Adriano 03510d3940 Area riservata: menu essenziale e veste grafica del sito
Il menu in alto si riduce alle voci che servono davvero — Articoli,
Contenuti, Utenti, Sito, Esci — con la voce corrente evidenziata; ognuna
resta visibile solo a chi ha il ruolo per aprirla, e in pagina di login la
barra mostra il solo marchio. "Nuovo" esce dal menu perché il pulsante per
creare un articolo è già in cima all'elenco Articoli.

Il pannello smette di essere un foglio di stile a sé: adotta i font e la
palette del sito, come Campus e Stress Index, con tabelle, pulsanti, campi
e pillole di stato riportati allo stesso linguaggio.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-31 16:28:35 +02:00

32 lines
1.3 KiB
Plaintext

---
import Admin from '../../layouts/Admin.astro';
import { getDb } from '../../lib/db';
import { login, getSessionUser, landingFor, SESSION_COOKIE } from '../../lib/auth';
export const prerender = false;
let error = '';
if (Astro.request.method === 'POST') {
const form = await Astro.request.formData();
const token = login(getDb(), String(form.get('username') ?? ''), String(form.get('password') ?? ''));
if (token) {
Astro.cookies.set(SESSION_COOKIE, token, {
httpOnly: true, sameSite: 'lax', path: '/',
secure: import.meta.env.PROD, maxAge: 7 * 24 * 3600,
});
// Ogni ruolo atterra sulla sua sezione: campus fuori dal pannello, gli
// altri sulla pagina admin che possono effettivamente aprire.
return Astro.redirect(landingFor(getSessionUser(getDb(), token)?.role ?? 'user'));
}
error = 'Credenziali non valide.';
}
---
<Admin title="Login">
<h1>Accesso</h1>
{error && <p class="form-msg form-msg--err">{error}</p>}
<form class="aform" method="post">
<input class="afield" name="username" placeholder="Utente" required autocomplete="username" />
<input class="afield" type="password" name="password" placeholder="Password" required autocomplete="current-password" />
<button class="abtn" type="submit">Entra</button>
</form>
</Admin>