03510d3940
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>
32 lines
1.3 KiB
Plaintext
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>
|